我有一个包含人员 ID 和日期范围(开始日期和停止日期)的表格。每个人可能有多个具有多个开始和结束日期的行。
create table #DateRanges (
tableID int not null,
personID int not null,
startDate date,
endDate date
);
insert #DateRanges (tableID, personID, startDate, endDate)
values (1, 100, '2011-01-01', '2011-01-31') -- Just January
, (2, 100, '2011-02-01', '2011-02-28') -- Just February
, (3, 100, '2011-04-01', '2011-04-30') -- April - Skipped March
, (4, 100, '2011-05-01', '2011-05-31') -- May
, (5, 100, '2011-06-01', '2011-12-31') -- June through December
我需要一种方法来折叠相邻的日期范围(前一行的结束日期正好是下一行的开始日期前一天)。但它必须包括所有连续的范围,仅当端到端差距大于一天时才拆分。上述数据需要压缩成:
+-----------+----------+--------------+------------+
| SomeNewID | PersonID | NewStartDate | NewEndDate |
+-----------+----------+--------------+------------+
| 1 | 100 | 2011-01-01 | 2011-02-28 |
+-----------+----------+--------------+------------+
| 2 | 100 | 2011-04-01 | 2011-12-31 |
+-----------+----------+--------------+------------+
只有两行,因为唯一缺少的范围是三月。现在,如果所有 March 都存在,无论是一排还是多排,压缩将导致只有一排。但如果只有 3 月中旬的两天,我们会得到第三行来显示 3 月的日期。
我一直在使用 SQL 2016 中的 LEAD 和 LAG 函数来尝试将其作为记录集操作来完成,但到目前为止都是空的。我希望能够在没有循环和 RBAR 的情况下做到这一点,但我没有看到解决方案。