Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle sql查询将两组日期按顺序分组_Sql_Oracle_Plsql_Oracle11g - Fatal编程技术网

Oracle sql查询将两组日期按顺序分组

Oracle sql查询将两组日期按顺序分组,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我有下一张桌子: 雇员 代码 开始日期 结束日期 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

我有下一张桌子:

雇员 代码 开始日期 结束日期 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
我用下面的查询解决了这个问题,虽然我知道这不是最优雅的一个。请将表_1替换为保存数据的实际表名或视图

运行以下命令时,我检索到以下结果

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)
结果:

结果为文本形式,我不知道如何将其格式化为表格:

员工代码最小值(开始日期)最大值(结束日期) 02097368 F7H3 09-JUL-18 13-APR-19 02097368 F7S3 14-APR-19 24-MAR-20
02097368 F7S3 31-JAN-21-

你的意思是“如果第N行的开始日期在第N-1行之后一天,则将这两行视为一行/好像日期范围是连续的?确切地说,只有当代码不同或日期范围不连续时才开始新行。这看起来会产生2行,而不是提问者要找的3行。是的,你是对的!抱歉,我现在就修改这个