根据两列的组合将其重复记录组合成一条记录,并指定Min start_date和Max end_date

问题描述

此图像将向您显示问题结构

1

这应该是所需的输出

2

我想从重复记录中填充 Min Start_Date Max End_Date (基于 Present 和 Absent 列)并制作一个主记录,与 Present Absent 列的其他组合相同

我已经按照ID和开始日期进行了排序,以了解数据的行为。 我仅针对一个ID提到过这种情况,存在的其他ID也应提供相同类型的输出,如果我得到此示例的有效解决方案,则可以在整个表上实现正确的逻辑。 我尝试使用窗口功能,但未实现任何解决方案。 预先感谢

请注意,根据存在和不存在的列, ID 的重复记录数是可变的。

解决方法

这是一个空白问题。考虑使用行号之间的差异来构建“相邻”记录组,然后可以合并:

select id,min(start_date) start_date,max(end_date end_date,present,absent
from (
    select t.*,row_number() over(partition by id order by start_date) rn1,row_number() over(partition by id,absent order by start_date) rn2
    from mytable t
) t
group by id,absent,rn1 - rn2
order by 1,2
,

您可以使用MATCH_RECOGNIZE

SELECT *
FROM   table_name
MATCH_RECOGNIZE (
   PARTITION BY id
   ORDER BY     start_date
   MEASURES     FIRST( start_date ) AS start_date,MAX( end_date )     AS end_date,FIRST( present )    AS present,FIRST( absent )     AS absent
   ONE ROW PER MATCH
   PATTERN      (FIRST_ROW EQUAL_ROWS*)
   DEFINE       EQUAL_ROWS AS
   (
     (
       (
         EQUAL_ROWS.present = PREV(EQUAL_ROWS.present)
       ) OR (
         EQUAL_ROWS.present IS NULL AND PREV(EQUAL_ROWS.present) IS NULL
       )
     ) AND (
       (
         EQUAL_ROWS.absent  = PREV(EQUAL_ROWS.absent)
       ) OR (
         EQUAL_ROWS.absent IS NULL AND PREV(EQUAL_ROWS.absent) IS NULL
       )
     )
   )
)

因此,对于您的示例数据:

CREATE TABLE table_name ( id,start_date,end_date,absent ) AS
SELECT 1,DATE '2020-02-01',DATE '2020-03-01','Y','N'  FROM DUAL UNION ALL
SELECT 1,DATE '2020-03-04',DATE '2020-04-19',DATE '2020-03-06',DATE '2020-03-09','N',DATE '2020-05-04',DATE '2020-09-04','Y'  FROM DUAL UNION ALL
SELECT 1,DATE '2020-05-06',DATE '2020-06-26',DATE '2020-07-12',DATE '2020-08-12',NULL,NULL FROM DUAL UNION ALL
SELECT 1,DATE '2020-08-13',NULL FROM DUAL;

这将输出:

ID | START_DATE | END_DATE  | PRESENT | ABSENT
-: | :--------- | :-------- | :------ | :-----
 1 | 01-FEB-20  | 19-APR-20 | Y       | N     
 1 | 06-MAR-20  | 09-MAR-20 | N       | N     
 1 | 04-MAY-20  | 04-SEP-20 | N       | Y     
 1 | 12-JUL-20  | 12-AUG-20 | null    | null  

db 提琴here