根据日期顺序查询分组依据

时间:2019-09-23 22:37:54

标签: sql sql-server

我有一张桌子,例如:

enter image description here

我想用日期压缩它以获得:

enter image description here

我使用的是“ GROUP BY”,但由于它将所有的“ T”组合在一起,因此无法正常工作。如何强制SQL Server将订单保留为分组?

1 个答案:

答案 0 :(得分:1)

这是一个典型的隔岛问题。您可以为共享相同的name的记录组中以及共享相同的name type的组中的记录分配行号。行号之间的差异为您提供每条记录所属的组。

考虑:

SELECT 
   name,
   MIN(date) FromDate,
   MAX(date) ToDate,
   type
FROM (
    SELECT 
        t.*,
        ROW_NUMBER() OVER(PARTITION BY name ORDER BY date) rn1,
        ROW_NUMBER() OVER(PARTITION BY name, type ORDER BY date) rn2
    FROM mytable t
) x
GROUP BY name, rn1 - rn2, type
ORDER BY name, FromDate

Demo on DB Fiddle

name | FromDate |   ToDate | type
:--- | -------: | -------: | :---
Jack | 19700715 | 19890831 | T   
Jack | 19910920 | 19920526 | N   
Jack | 19930409 | 20160411 | T