我正在寻找一些使用日期时间每日行进行分组来构建日期范围间隔
我的表格如下:
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
提前感谢您的帮助
答案 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/