微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

对于下表,我想:

我。合并行,以便对于每种电话类型,将相同电话号码的集合合并为具有唯一开始日期和结束日期的唯一电话号码

二。合并电话号码的 START DATE 是集合的最早开始日期 并且合并电话号码的 END DATE 是集合的 LATEST 结束日期

三。此外,我想确保当某些不同的电话号码按时间顺序夹在一组相同的电话号码中时(由红色虚线箭头表示),这些相同的电话号码不会合并为一行。而是将它们合并为单独的集合。这是因为按时间顺序,它们现在是独立的集合

enter image description here

我目前使用的脚本满足第一个和第二个要求,但不满足第三个要求

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_NUMBER

有谁知道是否有任何方法可以增强脚本(或有一个完全不同的脚本)也可以满足第三个要求?

预期结果如下:

enter image description here

插入数据示例

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,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,to_date('09-JAN-12',to_date('01-JAN-12','Alternate',7651000001,to_date('09-MAR-11',to_date('22-FEB-11',to_date('19-AUG-10',to_date('16-AUG-10',2062009876,to_date('14-AUG-10',to_date('08-APR-10',to_date('06-APR-10',to_date('08-JUL-09',to_date('15-JAN-09',7650880880,to_date('22-DEC-08',to_date('07-AUG-08',to_date('06-AUG-08',to_date('13-NOV-07',to_date('28-MAR-08','DD-MON-RR'));

解决方法

这就是所谓的孤岛和缺口问题。

您可以使用如下解析函数:

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,PHONE_NUMBER order by start_date) as rn_p
   From CLAIMANTDATA t) t
Group by CLAIMANT_ID,rn-rn_p
,

在 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)
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。