2015-12-04 111 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