2017-07-24 108 views
1

我有一張表。我想獲取每個獨特的CoatingChambersID的最後一行。有24個獨特的房間,最後一行顯示房間在最後一個狀態的時間。SQL:獲取每個唯一標識的最後一行

我可以得到一個獨特的名單像這樣:

SELECT distinct CoatingChambersID, MAX(LastDT) as LastDT 
    FROM [REO].[dbo].[CoatingChamberStateLogs] 
    group by CoatingChambersID 

但我無法弄清楚如何加入該回到原來的表。

在此先感謝您的幫助!

CoatingChamberStateLogsID CoatingChambersID StartDT LastDT IntervalMin CoatingChamberStatesID 
1001712 1003 2017-01-24 23:09:29.8 2017-01-25 03:04:32.6758500 235.053543986667 1007  
1001713 1006 2017-01-24 23:09:29.8 2017-01-25 00:30:30.8478433 81.0230772083333 1007  
1001714 1015 2017-01-24 23:09:29.8 2017-01-25 04:21:33.7601011 312.071614838333 1007  
1001715 1024 2017-01-24 23:09:29.8 2017-01-31 04:43:21.5643016 8973.86835151333 1001  
1001716 1016 2017-01-24 23:09:29.8 2017-01-25 00:01:30.4200122 52.01594669 1006  
1001717 1017 2017-01-24 23:09:29.8 2017-01-24 23:15:29.8261612 6.00604917333333 1006  
1001718 1018 2017-01-24 23:09:29.8 2017-01-26 01:42:49.4040548 1593.3323474 1006 0 
1001719 1019 2017-01-24 23:09:29.8 2017-01-25 02:25:32.3047026 196.047358196667 1005  
1001720 1020 2017-01-24 23:09:29.8 2017-01-24 23:12:29.8009482 3.00562895666667 1007  
1001721 1022 2017-01-24 23:09:29.8 2017-01-25 02:52:32.5995144 223.052271726667 1007  
1001722 1023 2017-01-24 23:09:29.8 2017-01-25 03:05:32.9236594 236.057674143333 1007  
1001723 1002 2017-01-24 23:09:29.4475820 2017-01-25 02:14:32.1723891 185.045413451667 1001  
1001724 1004 2017-01-24 23:09:29.8 2017-01-25 00:39:31.0878194 90.02707681 1001  
1001725 1005 2017-01-24 23:09:29.8 2017-01-24 23:18:29.8783565 9.006919095 1001  
+0

我添加了SQL Server標記,因爲SQL看起來像SQL Server。 –

+0

可能重複[檢索每個組中的最後一條記錄](https://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) –

回答

6

使用row_number()

select ccs.* 
from (select ccs.*, 
      row_number() over (partition by ccs.CoatingChambersID order by ccs.LastDt desc) as seqnum 
     from [REO].[dbo].[CoatingChamberStateLogs] ccs 
    ) ccs 
where seqnum = 1; 

select distinctgroup by使用是幾乎從來沒有正確的。

另一種有趣的方式來編寫查詢不需要子查詢:

select top (1) with ties ccs.* 
from [REO].[dbo].[CoatingChamberStateLogs] ccs 
order by row_number() over (partition by ccs.CoatingChambersID order by ccs.LastDt desc); 
+0

該死的你快! –

+0

謝謝!我需要關於分區的RTFM。 –

+0

交叉應用自連接會更快嗎?我喜歡'with ties' ..按技巧排序以避免子查詢。 – xQbert

0

雖然我喜歡戈登的答案......我想提供一個輔助的選擇。 我還沒有花時間來確定交叉應用是否會更有效率;但考慮到加入這裏的成本,我會認爲他可能更有效率。但沒有測試我不能說。

SELECT B.* 
FROM [REO].[dbo].[CoatingChamberStateLogs] A 
CROSS APPLY (SELECT TOP 1 * 
      FROM [REO].[dbo].[CoatingChamberStateLogs] B 
      WHERE A.CoatingChambersID = B.CoatingChambersID 
      ORDER BY lastDT Desc) 

我知道它運作良好,在衆多的前N個紀錄在1-M的關係,但因爲這是自加入他的反應可能會導致更好的執行計劃,因爲它避免了一起。

相關問題