SQL组与前一行的日期差异

时间:2018-02-27 21:21:33

标签: sql-server sql-server-2008

我正在寻找一些使用日期时间每日行进行分组来构建日期范围间隔

我的表格如下:

id | A  | B  | Date
1  | 1  | 2  | 1/10/2010
2  | 1  | 2  | 2/10/2010
3  | 1  | 2  | 3/10/2010
4  | 1  | 3  | 4/10/2010
5  | 1  | 3  | 5/10/2010
6  | 1  | 2  | 6/10/2010
7  | 1  | 2  | 7/10/2010
8  | 1  | 2  | 8/10/2010

我的第一次尝试是:

SELECT A, B, MIN(DATE), MAX(date)
FROM table
GROUP BY A, B

因此,在按A,B分组后,在我的选择中使用min和max以及日期,由于重复B = 2,我得到的结果无效。

     A    B   Date                 A  B   min(Date)  max(Date)
1  | 1  | 2  | 1/10/2010           1  2 | 1/10/2010  8/10/2010
2  | 1  | 2  | 2/10/2010  Invalid
3  | 1  | 2  | 3/10/2010  ------->
6  | 1  | 2  | 6/10/2010
7  | 1  | 2  | 7/10/2010
8  | 1  | 2  | 8/10/2010

我正在寻找如何计算该组的第三个成员... 所以预期的间隔结果如下:

     A    B   Start Date    End Date 
.. | 1  | 2 | 1/10/2010  | 3/10/2010
.. | 1  | 3 | 4/10/2010  | 5/10/2010 
.. | 1  | 2 | 6/10/2010  | 8/10/2010

我需要支持SQL Server 2008

提前感谢您的帮助

1 个答案:

答案 0 :(得分:2)

以下是处理“岛屿和差距”的简单方法。你需要在连续日期找到差距:

SELECT A, B, StartDate = MIN([Date]), EndDate = MAX([Date])
FROM
(
    SELECT *,
        RN = DATEDIFF(DAY, 0, [Date]) - ROW_NUMBER() OVER (PARTITION BY A, B ORDER BY [Date])
    FROM myTable
) AS T
GROUP BY A, B, RN;

要将其分解为稍微简单易懂的逻辑:您为每个日期分配一个数字(此处为DATEDIFF(DAY, 0, [Date])),每个日期为行号(在此处按A和B分区),然后在任何时间&# 39;日期中的差距,这两者之间的差异将会改变。

您可以使用各种资源来了解“岛屿和差距”的不同方法。问题。以下是可以帮助您解决其他类型的问题:https://www.red-gate.com/simple-talk/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/