如何计算排除终止(T)时段的员工服务时长(天数)
员工服务时长计算问题
我有一个结构如下的JobHistory数据集,需要计算员工的总服务时长(天数),规则如下:
- 排除状态(
Status列)为'T'(终止)的时段 - 状态为'L'(休假)的时段需计入
- 数据中存在重复的'A'(在职)记录
目前我能通过以下SQL语句计算从首次生效日期到当前日期的总天数,但需要实现减去终止时段的方案:
SELECT EmpNo, DateDiff(dd, MIN(EffDate), getdate()) as LOS FROM JobHistory WHERE EmploymentStatus = 'A' Group By EmpNo
我了解到可以用Lag/Lead函数实现,想请教社区这是否是最优高效的方案,欢迎提供相关建议或思路。
数据集
| EmpNo | EffDate | Status | EmploymentStatus |
|---|---|---|---|
| 001 | 2018-12-10 00:00:00.000 | A | A |
| 001 | 2018-12-10 00:00:00.000 | A | A |
| 001 | 2018-12-12 00:00:00.000 | A | A |
| 001 | 2018-12-31 00:00:00.000 | A | A |
| 001 | 2019-10-15 00:00:00.000 | T | A |
| 001 | 2021-08-16 00:00:00.000 | A | A |
| 001 | 2021-11-15 00:00:00.000 | A | A |
| 001 | 2021-11-15 00:00:00.000 | A | A |
| 001 | 2021-12-08 00:00:00.000 | A | A |
| 001 | 2022-01-03 00:00:00.000 | A | A |
| 001 | 2022-01-10 00:00:00.000 | A | A |
| 001 | 2022-03-11 00:00:00.000 | A | A |
| 001 | 2022-03-14 00:00:00.000 | A | A |
| 001 | 2022-05-09 00:00:00.000 | T | A |
| 001 | 2022-09-12 00:00:00.000 | A | A |
| 001 | 2022-10-10 00:00:00.000 | A | A |
| 001 | 2022-10-24 00:00:00.000 | A | A |
| 001 | 2023-02-20 00:00:00.000 | A | A |
| 002 | 2018-12-05 00:00:00.000 | A | A |
| 002 | 2018-12-05 00:00:00.000 | A | A |
| 002 | 2018-12-31 00:00:00.000 | A | A |
| 002 | 2019-08-31 00:00:00.000 | L | A |
| 002 | 2019-09-28 00:00:00.000 | A | A |
| 002 | 2019-09-29 00:00:00.000 | L | A |
| 002 | 2019-10-18 00:00:00.000 | A | A |
| 002 | 2019-10-21 00:00:00.000 | A | A |
| 002 | 2019-11-25 00:00:00.000 | A | A |
| 002 | 2019-11-25 00:00:00.000 | A | A |
| 002 | 2019-12-09 00:00:00.000 | A | A |
| 002 | 2019-12-30 00:00:00.000 | A | A |
| 002 | 2020-03-12 00:00:00.000 | T | A |
| 002 | 2022-01-17 00:00:00.000 | A | A |
预期结果(以2023-05-07为运行日期)
| EmpNo | LOS |
|---|---|
| 001 | 811 |
| 002 | 938 |
计算说明
- 员工001:1609(首次生效日期至2023-05-07的天数)-670(第一次终止时段天数)-128(第二次终止时段天数)=811
- 员工002:1615(首次生效日期至2023-05-07的天数)-677(终止时段天数)=938
内容的提问来源于stack exchange,提问作者Bumbaro2217
相关产品推荐
相关产品推荐

