【问题标题】:Oracle sql query to group two sets of dates if sequencials如果顺序,Oracle sql查询将两组日期分组
【发布时间】: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


【解决方案1】:

尽管我知道这不是最优雅的查询,但我通过以下查询解决了这个问题。请将 TABLE_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)

结果:

导致我不知道如何格式化为表格的文本形式:

员工代码最小值(START_DATE)最大值(END_DATE) 02097368 F7H3 09-JUL-18 13-APR-19 02097368 F7S3 14-APR-19 24-MAR-20 02097368 F7S3 31-JAN-21 -

【讨论】:

  • 看起来它会产生 2 行,而不是提问者正在寻找的 3 行。
  • 是的,你是对的!抱歉,现在将修改此内容
猜你喜欢
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2018-02-17
相关资源
最近更新 更多