Oracle sql 查询将两组日期分组
Oracle sql query to group two sets of dates if sequencials
我有下一个table:
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
我通过以下查询解决了这个问题,但我知道这不是最优雅的查询。请将 TABLE_1 替换为实际的 table 名称或保存数据的视图
当运行以下时,我检索到以下结果
SELECT EMPLOYEE, CODE, MIN(START_DATE), MAX(END_DATE) FROM
(
SELECT EMPLOYEE, CODE, START_DATE, END_DATE, CASE
WHEN (TEMP1=1 OR TEMP2=1) THEN 'ONE_CLASS'
ELSE 'OTHER' END CLASS_X
FROM
(SELECT EMPLOYEE, CODE,
START_DATE, END_DATE,
X AS TEMP1, LEAD(X) OVER (ORDER BY START_DATE) AS TEMP2
FROM (
SELECT EMPLOYEE, CODE,
LAG(END_DATE) OVER (ORDER BY START_DATE) AS PREV_PERIOD_END_DATE,
START_DATE, END_DATE,
START_DATE - LAG(END_DATE) OVER (ORDER BY START_DATE) AS X
FROM TABLE_2
ORDER BY START_DATE) A
) B
) C
GROUP BY EMPLOYEE, CODE, CLASS_X
ORDER BY MIN(START_DATE)
结果:
我不知道如何格式化为文本形式的结果 table:
员工代码最小值(START_DATE)最大值(END_DATE)
02097368 F7H3 09-JUL-18 13-APR-19
02097368 F7S3 14-APR-19 24-MAR-20
02097368 F7S3 21 年 1 月 31 日 -
我有下一个table:
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 |
我通过以下查询解决了这个问题,但我知道这不是最优雅的查询。请将 TABLE_1 替换为实际的 table 名称或保存数据的视图
当运行以下时,我检索到以下结果
SELECT EMPLOYEE, CODE, MIN(START_DATE), MAX(END_DATE) FROM
(
SELECT EMPLOYEE, CODE, START_DATE, END_DATE, CASE
WHEN (TEMP1=1 OR TEMP2=1) THEN 'ONE_CLASS'
ELSE 'OTHER' END CLASS_X
FROM
(SELECT EMPLOYEE, CODE,
START_DATE, END_DATE,
X AS TEMP1, LEAD(X) OVER (ORDER BY START_DATE) AS TEMP2
FROM (
SELECT EMPLOYEE, CODE,
LAG(END_DATE) OVER (ORDER BY START_DATE) AS PREV_PERIOD_END_DATE,
START_DATE, END_DATE,
START_DATE - LAG(END_DATE) OVER (ORDER BY START_DATE) AS X
FROM TABLE_2
ORDER BY START_DATE) A
) B
) C
GROUP BY EMPLOYEE, CODE, CLASS_X
ORDER BY MIN(START_DATE)
结果:
我不知道如何格式化为文本形式的结果 table:
员工代码最小值(START_DATE)最大值(END_DATE) 02097368 F7H3 09-JUL-18 13-APR-19 02097368 F7S3 14-APR-19 24-MAR-20 02097368 F7S3 21 年 1 月 31 日 -