历史表转拉链表

-- 创建表

-- Create table

create table CCS2_DBA.T_SYF_20200410

(

  name_id      VARCHAR2(32),

  monitor_name VARCHAR2(200),

  operate_date DATE,

  operate_type VARCHAR2(10)

);

-- Add comments to the table

comment on table CCS2_DBA.T_SYF_20200410

  is '名单监控表';

-- Add comments to the columns

comment on column CCS2_DBA.T_SYF_20200410.name_id

  is '名单编号';

comment on column CCS2_DBA.T_SYF_20200410.monitor_name

  is '名单';

comment on column CCS2_DBA.T_SYF_20200410.operate_date

  is '操作时间';

comment on column CCS2_DBA.T_SYF_20200410.operate_type

  is '操作类型(1:开启监控,2:关闭监控)';


-- 准备数据

-- 正常情况

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('001','名单一',TO_DATE('20200101','YYYYMMDD'),'1');

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('001','名单一',TO_DATE('20200111','YYYYMMDD'),'2');

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('001','名单一',TO_DATE('20200121','YYYYMMDD'),'1');

-- 模拟重复关闭

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('002','名单二',TO_DATE('20200201','YYYYMMDD'),'1');

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('002','名单二',TO_DATE('20200211','YYYYMMDD'),'1');

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('002','名单二',TO_DATE('20200221','YYYYMMDD'),'2');

-- 模拟先关闭再开启

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('003','名单三',TO_DATE('20200301','YYYYMMDD'),'2');

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('003','名单三',TO_DATE('20200311','YYYYMMDD'),'1');

-- 模拟重复开启

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('004','名单四',TO_DATE('20200401','YYYYMMDD'),'1');

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('004','名单四',TO_DATE('20200411','YYYYMMDD'),'1');

INSERT INTO CCS2_DBA.T_SYF_20200410(NAME_ID, MONITOR_NAME, OPERATE_DATE, OPERATE_TYPE)VALUES('004','名单四',TO_DATE('20200421','YYYYMMDD'),'2');

COMMIT;

-- 查询语句

SELECT NAME_ID, MONITOR_NAME, MIN(ST) AS START_DT, ED_DT AS END_DT

  FROM (SELECT MIN(A.NAME_ID) OVER(PARTITION BY MONITOR_NAME) AS NAME_ID,

              A.MONITOR_NAME,

              OPERATE_DATE,

              CASE

                WHEN OPERATE_TYPE = '1' THEN

                  OPERATE_DATE

                ELSE

                  NULL

              END AS ST,

              NVL(MIN(CASE

                        WHEN OPERATE_TYPE = '2' THEN

                          OPERATE_DATE

                        ELSE

                          NULL

                      END)

                  OVER(PARTITION BY MONITOR_NAME ORDER BY OPERATE_DATE ROWS BETWEEN CURRENT

                        ROW AND UNBOUNDED FOLLOWING),

                  TO_DATE('30001231', 'YYYYMMDD')) AS ED_DT,

              OPERATE_TYPE,

              ROW_NUMBER() OVER(PARTITION BY MONITOR_NAME ORDER BY OPERATE_DATE ASC) AS RW

          FROM CCS2_DBA.T_SYF_20200410 A)

WHERE ST IS NOT NULL

GROUP BY NAME_ID, ED_DT, MONITOR_NAME

ORDER BY 1,3;

--结果

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 1,121评论 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,725评论 0 3
  • wyun_guest需要添加的地方 1: oauth_clients需要添加一条记录image.png INSER...
    EddieZhang阅读 697评论 0 0
  • --查询存储过程、触发器、函数、包、包体、类型、类型体的内容 SELECT * FROM DBA_SOURCE; ...
    峯_阅读 651评论 0 50
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,505评论 0 13