【发布时间】:2021-08-16 03:01:29
【问题描述】:
我有下一张桌子:
| EMPLOYEE | CODE | START_DATE | END_DATE |
|---|---|---|---|
| 02097368 | F7H3 | 09/07/2018 | 20/10/2018 |
| 02097368 | F7H3 | 21/10/2018 | 05/01/2019 |
| 02097368 | F7H3 | 06/01/2019 | 12/01/2019 |
| 02097368 | F7H3 | 13/01/2019 | 02/02/2019 |
| 02097368 | F7H3 | 03/02/2019 | 13/04/2019 |
| 02097368 | F7S3 | 14/04/2019 | 04/01/2020 |
| 02097368 | F7S3 | 05/01/2020 | 24/03/2020 |
| 02097368 | F7S3 | 31/01/2021 |
我想按员工、代码和顺序日期对数据进行分组(end_date 到下一个 start_date,如果它晚 1 天)
期望的结果:
| EMPLOYEE | CODE | START_DATE | END_DATE |
|---|---|---|---|
| 02097368 | F7H3 | 09/07/2018 | 13/04/2019 |
| 02097368 | F7S3 | 14/04/2019 | 24/03/2020 |
| 02097368 | F7S3 | 31/01/2021 |
我正在尝试这个,但我没有得到想要的结果
SELECT EMPLOYEE,
CODE,
MIN (START_DATE) AS START_DATE,
MAX (END_DATE)
KEEP (DENSE_RANK FIRST ORDER BY END_DATE DESC NULLS FIRST)
AS END_DATE
FROM (SELECT T.*,
ROW_NUMBER ()
OVER (PARTITION BY EMPLOYEE ORDER BY START_DATE)
AS seqnum_i,
ROW_NUMBER ()
OVER (PARTITION BY EMPLOYEE, CODE ORDER BY START_DATE)
AS seqnum_ir
FROM CODE_HIST T
WHERE EMPLOYEE= '02097368') T
GROUP BY ID_EMPLEADO, (seqnum_i - seqnum_ir), CODE;
实际结果:
| EMPLOYEE | CODE | START_DATE | END_DATE |
|---|---|---|---|
| 02097368 | F7H3 | 09/07/2018 | 13/04/2019 |
| 02097368 | F7S3 | 14/04/2019 |
【问题讨论】:
-
所以你的意思是“如果第 N 行的开始日期是第 N-1 行之后的一天,则将这两行视为一个/好像日期范围是连续的?
-
没错,只有当 CODE 不同或日期范围不连续时才开始新行。
标签: sql oracle plsql oracle11g