2015-12-04 79 views
3

我知道如何在sql查詢中使用MAX()函數和GROUP BY子句,但在我的情況下,我想要組的記錄有點不同。如何在sql查詢中獲取連續記錄條目的最大值?

,比如我有一個下表

HostName ModifyDate    Sr No 
------------------------------------------- 
PC-1  2015-12-04 08:45:52.847 1 
PC-1  2015-12-04 08:48:51.025 2 
PC-2  2015-12-04 08:50:01.125 3 
PC-2  2015-12-04 08:50:45.545 4 
PC-2  2015-12-04 08:53:44.897 5 
PC-1  2015-12-04 09:02:17.524 6 
PC-2  2015-12-04 09:18:36.788 7 
PC-2  2015-12-04 09:22:01.041 8 
PC-1  2015-12-04 09:31:41.744 9 

而結果應該是這樣的

HostName ModifyDate    Sr No 
------------------------------------------ 
PC-1  2015-12-04 08:48:51.025 2 
PC-2  2015-12-04 08:53:44.897 5 
PC-1  2015-12-04 09:02:17.524 6 
PC-2  2015-12-04 09:22:01.041 8 
PC-1  2015-12-04 09:31:41.744 9 

Sql Fiddle

上述結果表明,連續主機名記錄最高日紀錄。你可以看到有3個參賽作品(SrNo 3,4,5),但我只拿到了第三個,這三個都是最新的。在前兩個記錄中也使用了相同的場景(SrNo1,2),我只取得了這兩個記錄中的最新記錄。

問題是我不能採取最大日期記錄。如果我使用MAX(ModifyDate)HostName組,那麼它將只返回兩個最新的記錄(Sr No 8和9)。我想獲得每個連續HostName條目的最大記錄。

注意:我無法爲其創建存儲過程。我想通過單個sql語句獲取該記錄。表中沒有Sr No字段。我只是爲了理解這個案子而已。

+0

這是一個經典的差距和是土地問題。你會發現很多解決方案。 – shawnt00

回答

1

這是一個Grouping Islands of Contiguous Dates問題可使用ROW_NUMBER解決:

SQL Fiddle

WITH Cte AS(
    SELECT *, 
     grp  = ROW_NUMBER() OVER(ORDER BY ModifyDate) - 
        ROW_NUMBER() OVER(PARTITION BY HostName ORDER BY ModifyDate), 
     SrNo = ROW_NUMBER() OVER(ORDER BY ModifyDate) 
    FROM LOG 
), 
CteFinal AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY HostName, grp ORDER BY SrNo DESC) 
    FROM Cte 
) 
SELECT 
    HostName, ModifyDate, SrNo 
FROM CteFinal 
WHERE rn = 1 
ORDER BY SrNo 
1

你可以試試這個方法..

SQL Fiddle

WITH CTE1 AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT ModifyDate)) RN,* FROM DATES9 
), 
CTE2 AS 
(
    SELECT CAST(1 AS INT) AS NRN, * FROM CTE1 WHERE RN=1 
    UNION ALL 
    SELECT CAST((CASE WHEN C1.HOSTNAME = C2.HOSTNAME THEN NRN ELSE NRN+1 END) AS INT) AS NRN,C1.* 
    FROM CTE1 C1 INNER JOIN CTE2 C2 ON C2.RN = C1.RN-1 
) 
select MAX(MODIFYDATE),HOSTNAME 
from CTE2 
GROUP BY NRN,HOSTNAME 
ORDER BY NRN