表结构及数据如下:

实际SQL案例解决方法整理_LEAD函数相关 Oracle 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

需求:

将记录按照时间顺序排列,每三条记录为一组,若第二条记录与第一条记录相差5分钟,则删除该记录,若第三条与第二条记录相差5分钟,则删除该记录,

第二组同理,遍历全表,按要求删除记录。

例如:

95500100000100500三条记录为一组,后两条记录均满足条件,均删除。(注意:虽然101000的记录与100500的记录也相差5分钟,但不是同一组,不能删除)

 

处理SQL如下:

WITH T AS

 (SELECT TIME_,

         DEL_TIME_2,

         CASE

           WHEN LABEL_ = 2 THEN

            NULL

           ELSE

            DEL_TIME_3

         END AS DEL_TIME_3

    FROM (SELECT TIME_,

                 LABEL_,

                 CASE

                   WHEN (TO_DATE(TIME_2, 'HH24:MI:SS') -

                        TO_DATE(TIME_, 'HH24:MI:SS')) * 24 * 60 = 5 THEN

                    TIME_2

                   ELSE

                    NULL

                 END AS DEL_TIME_2,

                 CASE

                   WHEN (TO_DATE(TIME_3, 'HH24:MI:SS') -

                        TO_DATE(TIME_2, 'HH24:MI:SS')) * 24 * 60 = 5 THEN

                    TIME_3

                   ELSE

                    NULL

                 END AS DEL_TIME_3

            FROM (SELECT TIME_, TIME_2, TIME_3, MOD(RN, 3) AS LABEL_

                    FROM (SELECT TIME_,

                                 LEAD(TIME_, 1) OVER(ORDER BY 1) AS TIME_2,

                                 LEAD(TIME_, 2) OVER(ORDER BY 1) AS TIME_3,

                                 ROWNUM AS RN

                            FROM TEMP_A

                           ORDER BY TO_DATE(TIME_, 'hh24:mi:ss'))

                   WHERE TIME_ IS NOT NULL)

           WHERE LABEL_ > 0))

SELECT DISTINCT DEL_TIME

  FROM T UNPIVOT(DEL_TIME FOR DEL_FLAG IN(DEL_TIME_2, DEL_TIME_3));

 

步骤:

 

1、涉及到每条记录与其后的记录的比较,故使用LEAD() OVER()函数,将数据按时间顺序排序后,将本记录、其后的第一条记录、其后的第二条记录分别置于同一行,并编号;

 实际SQL案例解决方法整理_LEAD函数相关 Oracle 第2张

 

2、若TIME_2TIME_相差5分钟,TIME_3TIME_2相差5分钟,则保留这两个时间点,置为DEL_TIME_2DEL_TIME_3

 

3、每三条记录为一组,利用编号RN字段对3取余,则每组的编号均为120,其中为编号为0的记录是每组的最后一条记录,其后的第一、第二条记录是下一组的记录,对本组的统计无意义,即使满足条件也不应删除,因此将编号为0的记录全部过滤;每组中编号为2的记录,其后的第二条记录是下一组的第一条记录,在本组中也不做考虑,置为NULL

 实际SQL案例解决方法整理_LEAD函数相关 Oracle 第3张

 

4、表中余下记录即为对应的时间点,满足条件的应删除的时间DEL_TIME_2DEL_TIME_3;将该两列合并为一列,并去重,得出最终结果;

实际SQL案例解决方法整理_LEAD函数相关 Oracle 第4张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄