跟踪连续缺席实例 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
我有一个名为 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