我试图在sql中构建一个视图,该视图用连续的日期范围标识和分组记录,并返回最早和最晚的日期

lymnna71  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(275)

我有一个缺勤天数表,我正在尝试构建一个视图,该视图将查找同一个人的所有连续缺勤记录,并返回最早的连续日期和最新的连续日期以及总天数和总小时数,即返回单个缺勤期间的摘要信息,即使它是作为多个连续记录输入的。
下面是当前数据的外观示例,以及我试图返回的信息
原始数据:

AbsenceID   PersonID   AbsenceDay   Days   Hours  
49334       9552       26/05/2020   0.5    3
49334       9552       27/05/2020   0.5    3
50000       9552       28/05/2020   1      7
50000       9552       29/05/2020   1      6
50010       9552       15/06/2020   1      6.5
50010       9552       16/06/2020   0.5    3.25
49334       8030       01/06/2020   0.5    4
49334       8030       02/06/2020   0.5    4
49334       8030       03/06/2020   0.5    4
49334       8030       04/06/2020   0.5    4
49334       8030       05/06/2020   0.5    4
49334       8030       06/06/2020   0.5    4
60012       8030       15/06/2020   0.5    3
60012       8030       16/06/2020   0.5    3

新视图:

AbsenceID  PersonID    PeriodStart  PeriodEnd      TotalDays   TotalHours
49334      9552        26/05/2020   29/05/2020     3           19
50000      9552        26/05/2020   29/05/2020     3           19
50010      9552        15/06/2020   16/06/2020     1.5         9.75
49334      8030        01/06/2020   06/06/2020     3           24
60012      8030        15/06/2020   16/06/2020     1           6
bogh5gae

bogh5gae1#

这是一种缺口和孤岛问题。您可以通过减去一个枚举值(行号)来标识相邻的范围。相邻日期保持不变:

select min(absenceId), personID, min(absenceday), max(absenceday),
       sum(days), sum(hours)
from (select t.*,
             row_number() over (partition by PersonID order by absenceday) as seqnum
      from t
     ) t
group by personID, dateadd(day, -seqnum, absenceday);

注意:这回答了您提出的问题:
返回单个缺勤期间的摘要信息,即使它是作为多个连续记录输入的。
你的抽样结果与第一次缺勤时间重复。这只返回该期间的一行。

相关问题