实际SQL案例解决方法整理_LEAD函数相关
表结构及数据如下:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
需求:
将记录按照时间顺序排列,每三条记录为一组,若第二条记录与第一条记录相差5分钟,则删除该记录,若第三条与第二条记录相差5分钟,则删除该记录,
第二组同理,遍历全表,按要求删除记录。
例如:
9:55:00,10:00:00,10:05:00三条记录为一组,后两条记录均满足条件,均删除。(注意:虽然10:10:00的记录与10:05:00的记录也相差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()函数,将数据按时间顺序排序后,将本记录、其后的第一条记录、其后的第二条记录分别置于同一行,并编号;
2、若TIME_2和TIME_相差5分钟,TIME_3和TIME_2相差5分钟,则保留这两个时间点,置为DEL_TIME_2,DEL_TIME_3;
3、每三条记录为一组,利用编号RN字段对3取余,则每组的编号均为1、2、0,其中为编号为0的记录是每组的最后一条记录,其后的第一、第二条记录是下一组的记录,对本组的统计无意义,即使满足条件也不应删除,因此将编号为0的记录全部过滤;每组中编号为2的记录,其后的第二条记录是下一组的第一条记录,在本组中也不做考虑,置为NULL;
4、表中余下记录即为对应的时间点,满足条件的应删除的时间DEL_TIME_2、DEL_TIME_3;将该两列合并为一列,并去重,得出最终结果;
