2017-10-11 95 views
1

我正在運行MS SQL-Server-2016我試圖從表中分割ParentId的第一個值。我有這樣一個數據集這樣:SQL從表中獲取第一個值

CREATE TABLE #TempTable 
(
    PTORequestDetailId INT, 
    PTORequestId INT, 
    DivisionPTOAccrualId INT, 
    RequestDate DATE, 
    StartTime DateTime, 
    Hours Decimal(19,2), 
    ResponseNotes nvarchar(500), 
    Status int, 
    CreatedOn DateTime, 
    ModifiedOn DateTime 
) 

INSERT INTO #TempTable 
SELECT 60, 48, 139, '2015-09-09', '2015-09-08 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION 
SELECT 61, 48, 139, '2015-09-10', '2015-09-09 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION 
SELECT 62, 48, 139, '2015-09-11', '2015-09-10 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION 
SELECT 63, 48, 139, '2015-09-13', '2015-09-12 20:00:00.000', 8.00,'',0, '2015-09-09 13:30:40.363', '2015-09-09 13:30:40.313' UNION 

CREATE TABLE #TempParent 
(
    PTORequestId INT, 
) 

INSERT INTO #TempParent 
SELECT 48 

運行,這將創建一個臨時表中的數據集我的工作。 我試圖走出的第一個值由#TempTable.PTORequestId劃分的DivisionPTOAccrualId,

SELECT #TempParent.*, AccrualDetails.* 
FROM #TempParent 
CROSS APPLY (
     SELECT FIRST_VALUE(#TempTable.DivisionPTOAccrualId) 
      OVER (PARTITION BY #TempTable.PTORequestId 
        ORDER BY #TempTable.PTORequestDetailId ASC 
        ROWS UNBOUNDED PRECEDING 
        ) as AccrualId 
     FROM #TempTable 
     WHERE #TempTable.PTORequestId = #TempParent.PTORequestId 
     ) as AccrualDetails 

基本上,我試圖讓139每排一次從我的父母,但FIRST_VALUE似乎返回多個結果,因此它創建了笛卡爾積。

因此,而不是獲取一個單行結果集

PTORequestId:48 AccrualId:139

第一個值應該只返回一個值 然而其返回4個值。 爲什麼會發生這種情況,我怎樣才能讓FIRST_VALUE每行返回一個值?

編輯

我認爲這正在發生,因爲我選擇從不是Temptable的FIRST_VALUE,所以它選擇的第一個值在臨時表的每一行。但我其實只做一次

對於任何需要澄清我做錯了什麼的人。 我期待我的分區通過篩選表中的行。 我假設,因爲表上的SUM將返回整個表的總和,而不是每行整個表的總和。這個總和工作基於分區數據,而不是這種情況。

回答

2

我不知道有First_Value()這樣做,但我覺得這是比較容易做Row_Number(),只取第一條記錄:

;With Cte As 
(
    Select T.*, 
      Row_Number() Over (Partition By T.PTORequestId Order By T.PTORequestDetailId) As RN 
    From #TempTable T 
    Join #TempParent P On P.PTORequestId = T.PTORequestId 
) 
Select PTORequestId, DivisionPTOAccrualId As AccruralId 
From Cte 
Where RN = 1 
+0

第一個值函數本質上是做同樣的事情。由於我是如何選擇一切的,所以第一個值不起作用。我的連接創建多行。 –

+0

但是,這幫助我認識到我的問題,我需要做更多的研究,然後才能接受這個答案,但我認爲你的權利我需要使用行號 –

相關問題