我有一个名为 Absence Details 的表,我想对连续日期进行分组。这里是数据
EID AbsenceType AbsenceStartDate AbsenceEndDate
769 Holiday 2012-06-25 00:00:00.000 2012-06-25 23:59:59.000
769 Holiday 2012-06-26 00:00:00.000 2012-06-26 23:59:59.000
769 Holiday 2012-09-03 00:00:00.000 2012-09-03 23:59:59.000
769 Holiday 2012-09-04 00:00:00.000 2012-09-04 23:59:59.000
769 Holiday 2012-09-05 00:00:00.000 2012-09-05 23:59:59.000
769 Holiday 2012-09-06 00:00:00.000 2012-09-06 23:59:59.000
769 Holiday 2012-09-07 00:00:00.000 2012-09-07 23:59:59.000
我想要得到的结果是
EID AbsenceType AbsenceStartDate AbsenceEndDate
769 Holiday 2012-06-25 00:00:00.000 2012-06-26 23:59:59.000
769 Holiday 2012-09-03 00:00:00.000 2012-09-07 23:59:59.000
任何帮助深表感谢。
最佳答案
我已经简化了您的场景以隔离主要问题。让我们假设这个表有间隙:
with ns as (
select 1 as n union
select 2 as n union
select 3 as n union
select 8 as n union --gap
select 9 as n )
select *
into #ns
from ns;
现在,您期望的结果是:ini fi
--- --
1 3
8 9
为了得到这个结果,我以这种方式处理数据:首先,我创建了两个具有开始和结束时间段的 View ,然后,我加入了两个 View 以获得最终结果。请注意,我将 table 与其自身连接以定位开始和结束时间段:with
inis as -- identifying start periods
(
select n1.n
from #ns n1
left outer join #ns n2
on n1.n = n2.n + 1
where n2.n is null
),
fis as -- identifying ends periods
(
select n1.n
from #ns n1
left outer join #ns n2
on n1.n = n2.n - 1
where n2.n is null
)
select inis.n as ini, min( fis.n ) as fi -- joining starts and ends
from inis
inner join fis
on inis.n <= fis.n
group by inis.n
;
您可以将此技术转移到您的数据和数据类型。如果您在翻译查询时有任何问题,请随时提出。Check query and results.
关于SQL Server 查询以对连续日期进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12491087/