ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

记一次oracle 连续记录合并处理 (LAG,LEAD,row_number())

2022-06-05 09:00:39  阅读:190  来源: 互联网

标签:ACCOUNT CUST LEAD LAG number MIG date DATE ID


需求

下图中的数据,要求 取出 seq 1,2 ;合并3~6,取最早生效时间,和 最晚失效时间 ;合并7~10,取最早生效时间,和 最晚失效时间。

以上需求理解为:  连续的cust_id 需要合并

方案:使用(LAG,LEAD,row_number())等函数处理

 测试数据

create table TMP_MIG_ACCOUNT

(

  acct_id  NUMBER(18) not null,

  seq_nbr  NUMBER(5) not null,

  cust_id  NUMBER(16),

  eff_date DATE not null,

  exp_date DATE not null

);

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 1, 700752288, to_date('01-01-2000', 'dd-mm-yyyy'), to_date('07-03-2013 17:39:55', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 2, 701059792, to_date('07-03-2013 17:39:56', 'dd-mm-yyyy hh24:mi:ss'), to_date('07-03-2013 17:40:13', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 3, 701059793, to_date('07-03-2013 17:40:14', 'dd-mm-yyyy hh24:mi:ss'), to_date('09-03-2013 13:02:04', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 4, 701059793, to_date('09-03-2013 13:02:05', 'dd-mm-yyyy hh24:mi:ss'), to_date('09-03-2013 13:35:01', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 5, 701059793, to_date('09-03-2013 13:35:02', 'dd-mm-yyyy hh24:mi:ss'), to_date('02-08-2014 12:14:22', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 6, 701059793, to_date('02-08-2014 12:14:23', 'dd-mm-yyyy hh24:mi:ss'), to_date('15-12-2014 15:05:08', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 7, 700752288, to_date('15-12-2014 15:05:09', 'dd-mm-yyyy hh24:mi:ss'), to_date('15-12-2014 15:06:08', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 8, 700752288, to_date('15-12-2014 15:06:09', 'dd-mm-yyyy hh24:mi:ss'), to_date('01-01-2019 21:59:23', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 9, 700752288, to_date('01-01-2019 21:59:24', 'dd-mm-yyyy hh24:mi:ss'), to_date('01-02-2019 19:04:08', 'dd-mm-yyyy hh24:mi:ss'));

insert into TMP_MIG_ACCOUNT (ACCT_ID, SEQ_NBR, CUST_ID, EFF_DATE, EXP_DATE)

values (90174285, 10, 700752288, to_date('01-02-2019 19:04:09', 'dd-mm-yyyy hh24:mi:ss'), to_date('01-01-9999', 'dd-mm-yyyy'));

 


处理过程

构建level 1 临时表

DROP TABLEMIG_ACCOUNT_2;

CREATE TABLE MIG_ACCOUNT_2 AS

SELECTA.ACCT_ID,

A.SEQ_NBR,

A.CUST_ID,

A.EFF_DATE,

A.EXP_DATE,

LAG(A.CUST_ID)OVER(PARTITIONBYA.ACCT_IDORDERBYA.SEQ_NBR)PREV_CUST_ID,

LEAD(A.CUST_ID)OVER(PARTITIONBYA.ACCT_IDORDERBYA.SEQ_NBR)NEXT_CUST_ID

FROM  TMP_MIG_ACCOUNT   A

ORDERBYA.ACCT_ID,A.SEQ_NBRASC;

SELECT*FROM  MIG_ACCOUNT_2  ;

构建level2 临时表

DROP TABLETMP_MIG_ACCOUNT_1;

CREATE TABLE TMP_MIG_ACCOUNT_1 AS

SELECTA.*,row_number()OVER(PARTITIONBYa.acct_idORDERBYa.seq_nbrASC)RN

FROMMIG_ACCOUNT_2 A

WHEREA.CUST_ID!=NVL(A.PREV_CUST_ID,0);

DROP TABLETMP_MIG_ACCOUNT_2;

CREATE TABLE TMP_MIG_ACCOUNT_2 AS

SELECT A.*,row_number()OVER(PARTITIONBYa.acct_idORDERBYa.seq_nbrASC)RN

FROM MIG_ACCOUNT_2 A

WHEREA.CUST_ID!=NVL(A.NEXT_CUST_ID,0);

SELECT*FROMTMP_MIG_ACCOUNT_1;

SELECT*FROMTMP_MIG_ACCOUNT_2;

组装数据

SELECTT1.ACCT_ID,

T1.SEQ_NBR,

T1.CUST_ID,

T1.EFF_DATE,

T1.EXP_DATE,

T1.PREV_CUST_ID,

T1.NEXT_CUST_ID,

T1.RN,

       T2.EXP_DATE LAST_EXP_DATE

FROMTMP_MIG_ACCOUNT_1 T1,TMP_MIG_ACCOUNT_2 T2

WHERET1.ACCT_ID=T2.ACCT_ID

ANDT1.CUST_ID=T2.CUST_ID

ANDT1.RN=T2.RN;

结果集为

 

标签:ACCOUNT,CUST,LEAD,LAG,number,MIG,date,DATE,ID
来源: https://www.cnblogs.com/HeisenbergUncertainty/p/16343347.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有