跟踪连续缺席实例 SQL

Tracking a continuous instance of absence SQL

我有一个名为 sickness 的 table,它记录了员工何时因病休假。它看起来像这样:

Date_Sick      Employee_Number
----------     ----------------
2020-06-08     001
2020-06-10     001
2020-06-11     001
2020-06-12     001
2020-06-08     002
2020-06-09     002

我想做的是添加一个具有唯一 ID 的新列,以标识唯一的缺席实例。一个独特的缺勤实例是连续工作日不间断地运行。因此我的输出 table 应该是这样的:

Date_Sick      Employee_Number   Sickness_ID
----------     ----------------  -----------
2020-06-08     001               1
2020-06-10     001               2
2020-06-11     001               2
2020-06-12     001               2
2020-06-08     002               3
2020-06-09     002               3

我尝试使用 LEAD/LAG 创建各种分区以检查下一个日期是否只有 1 天,但我无法让它工作。

AMENDMENT 这还需要只考虑个人工作的天数,我可以将其添加到 table。因此,对于任何日期,我都可以添加一个标志来表示 'Y' 或 'N' 来说明该员工是否应该在办公室。所以周末通常是 'N'.

有什么想法吗?

这是一个空岛问题。

在这里,我认为最简单的方法是row_number()和日期算法:

select date_sick, employee_number,
    dense_rank() over(order by employee_number,  dateadd(day, -rn, date_sick)) as sickness_id
from (
    select s.*,
        row_number() over(partition by employee_number order by date_sick) as rn
    from sickness s
) s
order by employee_number, date_sick

这是通过将 date_sick 与递增的 ID 进行比较,然后使用该信息对记录进行排名来实现的。

Demo on DB Fiddle - 首先感谢 Larnu 生成 DDL:

date_sick  | employee_number | sickness_id
:--------- | :-------------- | ----------:
2020-06-08 | 001             |           1
2020-06-10 | 001             |           2
2020-06-11 | 001             |           2
2020-06-12 | 001             |           2
2020-06-08 | 002             |           3
2020-06-09 | 002             |           3