MSSQL 查询开始和结束日期,其中日期依次为下一行 [重复]

MSSQL Query Start and End Date where dates sequential then next row [duplicate]

提问人:matt 提问时间:9/19/2023 最后编辑:Charliefacematt 更新时间:9/19/2023 访问量:29

问:

我有一个mssql表,如下所示

日历
ID int
CalendarDate 日期时间
可用位 预订位

示例记录为

1 01/09/2023 1 0
2 02/09/2023 1 0
3 03/09/2023 1 0
4 04/09/2023 1 0
5 05/09/2023 0 0
6 06/09/2023 0 0
7 07/09/2023 1 0
8 08/09/2023 1 0
9 09/09/2023 1 0

从这些数据中,我需要以下内容
: 第 1 行 - 开始日期 - 01/09/2023 |结束日期 - 04/09/2023 第 2 行 - 开始日期 - 07/09/2023
|结束日期 - 09/09/2023 日期 05/09/2023 和 06/09/2023
不可用,因此可以跳过

这些记录表示可用日期的开始和结束日期,这些日期将用于指示不可用的开始和结束日期。

请您为此提供最佳查询建议。

我已经看过使用滞后、超前和差异,这只是下一行/上一行的区别。

我实际上需要差异大于 1 的拆分,以及拆分前范围的开始和结束日期。

sql-server t-sql 间隙和孤岛

评论

2赞 Thom A 9/19/2023
这是一个典型的“缺口和孤岛”问题;搜索这个术语可能会给你很多解决方案。

答:

0赞 Tim Biegeleisen 9/19/2023 #1

这是一个差距和孤岛问题。一种方法使用行号差方法:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY CalendarDate) rn1,
              ROW_NUMBER() OVER (PARTITION BY Available ORDER BY CalendarDate) rn2
    FROM Calendar
)

SELECT MIN(CalendarDate) AS [Start Date],
       MAX(CalendarDate) AS [End Date]
FROM cte
WHERE Available = 1
GROUP BY rn1 - rn2
ORDER BY MIN(CalendarDate);