简体   繁体   English

将多行电话数据合并为显示开始和结束日期的单行的脚本

[英]Script that consolidates multiple rows of phone data into single rows showing start and end dates

For the below table, I will like to:对于下表,我想:

i.一世。 Consolidate the rows such that for each phone type, the sets of the same phone numbers are consolidated into unique phone numbers with a singular Start and End Date合并行,以便对于每种电话类型,将相同电话号码的集合合并为具有单个开始日期和结束日期的唯一电话号码

ii. ii. The consolidated phone number's START DATE is the EARLIEST start date of the set and the consolidated phone number's END DATE is the LATEST end date of the set合并电话号码的 START DATE 是集合的最早开始日期,合并电话号码的 END DATE 是集合的 LATEST 结束日期

iii. iii. Also I want to insure that when certain different phone numbers are sandwiched within a set of the same phone numbers chronologically (represented by the red dash arrows), those phone numbers that are the same are not consolidated into one single row.此外,我想确保当某些不同的电话号码按时间顺序夹在一组相同的电话号码中(由红色虚线箭头表示)时,那些相同的电话号码不会合并到一行中。 Rather they are consolidated as separate sets.相反,它们被合并为单独的集合。 This is because chronologically, they are now separate sets这是因为按时间顺序,它们现在是独立的集合

在此处输入图像描述

The script I have used so far satisfies the first and second requirement, but not the third到目前为止我使用的脚本满足第一个和第二个要求,但不满足第三个要求

SELECT CLAIMANT_ID, PHONE_TYPE, PHONE_NUMBER, 
Min(START_DATE), Max(END_DATE) KEEP (DENSE_RANK FIRST ORDER BY END_DATE DESC NULLS FIRST)
FROM ClaimantData
GROUP BY CLAIMANT_ID, PHONE_TYPE, PHONE_NUMBER

Does anyone know if there's any way to enhance the script (or have a totally different script) that can satisfy the third requirements as well?有谁知道是否有任何方法可以增强脚本(或具有完全不同的脚本)也可以满足第三个要求?

The Desired Outcome is as follows:预期结果如下:

在此处输入图像描述

Sample Data for Insert插入的示例数据

CREATE TABLE CLAIMANTDATA (    
CLAIMANT_ID NUMBER(9) NOT NULL,
PHONE_TYPE VARCHAR2(50 BYTE) NOT NULL,
PHONE_NUMBER VARCHAR2(50 BYTE) NULL,
START_DATE DATE NOT NULL,
END_DATE DATE NULL
);

Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Primary',7653030303,to_date('12-JAN-12','DD-MON-RR'),to_date('23-JAN-12','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Primary',7653030303,to_date('09-JAN-12','DD-MON-RR'),to_date('12-JAN-12','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Primary',7653030303,to_date('01-JAN-12','DD-MON-RR'),to_date('09-JAN-12','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('09-MAR-11','DD-MON-RR'),to_date('01-JAN-12','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('22-FEB-11','DD-MON-RR'),to_date('09-MAR-11','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('19-AUG-10','DD-MON-RR'),to_date('22-FEB-11','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('16-AUG-10','DD-MON-RR'),to_date('19-AUG-10','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',2062009876,to_date('14-AUG-10','DD-MON-RR'),to_date('16-AUG-10','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('08-APR-10','DD-MON-RR'),to_date('14-AUG-10','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('06-APR-10','DD-MON-RR'),to_date('08-APR-10','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('08-JUL-09','DD-MON-RR'),to_date('06-APR-10','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('15-JAN-09','DD-MON-RR'),to_date('08-JUL-09','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7650880880,to_date('22-DEC-08','DD-MON-RR'),to_date('15-JAN-09','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('07-AUG-08','DD-MON-RR'),to_date('22-DEC-08','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('06-AUG-08','DD-MON-RR'),to_date('07-AUG-08','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('06-AUG-08','DD-MON-RR'),to_date('06-AUG-08','DD-MON-RR'));
Insert into CLAIMANTDATA (CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,START_DATE,END_DATE) values (504,'Alternate',7651000001,to_date('13-NOV-07','DD-MON-RR'),to_date('28-MAR-08','DD-MON-RR'));

This is called island and gap problem.这称为孤岛和间隙问题。

You can use analytical function as follows:您可以使用解析 function 如下:

Select CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER,
        Min(start_date),
        Max(end_date)
  From
(Select t.*,
       Row_number() over (partition by CLAIMANT_ID, PHONE_TYPE order by start_date) as rn,
       Row_number() over (partition by CLAIMANT_ID, PHONE_TYPE, PHONE_NUMBER order by start_date) as rn_p
   From CLAIMANTDATA t) t
Group by CLAIMANT_ID,PHONE_TYPE,PHONE_NUMBER, rn-rn_p

In Oracle 12.1 or higher, the easiest way to solve such gaps-and-islands problems is with the match_recognize clause.在 Oracle 12.1 或更高版本中,解决此类间隙和孤岛问题的最简单方法是使用match_recognize子句。

select claimant_id, phone_type, phone_number, start_date, end_date
from   claimantdata
match_recognize (
  partition by claimant_id, phone_type
  order     by start_date
  measures  a.phone_number as phone_number,
            a.start_date as start_date, last(end_date) as end_date
  pattern   ( a b* )
  define    b as phone_number = a.phone_number and start_date = prev(end_date)
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM