SQL Server 查询以对连续日期进行分组

标签 sql tsql sql-server-2008-r2

我有一个名为 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/

相关文章:

sql - scope_identity 返回 null

sql - 在过程中定义模式

sql - 我可以与 HAVING 子句一起使用的第一个聚合函数

sql - 如何在单个语句中执行选择?

java - 使用存储过程优化查询

sql - 我在哪里可以找到/学习行业标准 SQL 约定?

sql-server - 每个 GROUP BY 表达式必须至少包含一列不是外部引用

SQL Server 2008 R2 子查询分组、汇总和计数

sql - 索引 View 与表上的索引

php - 比较两个表的行是否相等