修复SQL代码:标记用户连续多天从同一企业的下单记录
需求说明
从包含用户(USERT)、下单企业(COMPANY)及下单日期(CREATIONDATE)的数据集中,识别并标记同一用户在同一企业连续多天下单的记录:
- 仅标记同用户同企业的跨天连续下单记录
- 同一用户在不同企业的跨天下单无需标记
- 排除同一天内的集中下单(同一天多次下单不算连续多天下单)
最终要在原表基础上增加flag字段,用Y/N标识符合条件的记录。
原代码的问题
原SQL存在几个核心错误:
- 窗口函数排序逻辑错误:
PARTITION BY USERT ORDER BY USERT没有按日期排序,无法正确计算前后日期差 - 冗余判断:按
USERT分区后,前后记录必然是同一用户,无需额外判断USERT = prev_USERT - 忽略核心条件:未关联
COMPANY字段,会误标记不同企业的跨天下单 - 日期判断不严谨:未处理同一天重复下单的情况,会误将同一天多次下单判定为连续
修复后的SQL代码
WITH user_company_dates AS ( -- 去重:同一用户、企业、日期的记录只留一条,避免同一天重复下单干扰判断 SELECT DISTINCT USERT, CREATIONDATE, COMPANY FROM VEKPOLFA1P72_TESZT_P WHERE CREATIONDATE BETWEEN '20230601' AND '20230630' ), consecutive_check AS ( SELECT USERT, CREATIONDATE, COMPANY, -- 计算当前记录与上一条同用户同企业记录的日期差 DATEDIFF(DAY, LAG(CREATIONDATE) OVER(PARTITION BY USERT, COMPANY ORDER BY CREATIONDATE), CREATIONDATE) AS prev_day_diff, -- 计算当前记录与下一条同用户同企业记录的日期差 DATEDIFF(DAY, CREATIONDATE, LEAD(CREATIONDATE) OVER(PARTITION BY USERT, COMPANY ORDER BY CREATIONDATE)) AS next_day_diff FROM user_company_dates ) SELECT orig.USERT, orig.CREATIONDATE, orig.COMPANY, CASE -- 只要当前记录属于连续多天下单序列(和上/下一条同企业日期差为1),就标记为Y WHEN (t.prev_day_diff = 1) OR (t.next_day_diff = 1) THEN 'Y' ELSE 'N' END AS flag FROM VEKPOLFA1P72_TESZT_P orig LEFT JOIN consecutive_check t ON orig.USERT = t.USERT AND orig.CREATIONDATE = t.CREATIONDATE AND orig.COMPANY = t.COMPANY WHERE orig.CREATIONDATE BETWEEN '20230601' AND '20230630' ORDER BY orig.USERT, orig.CREATIONDATE;
代码逻辑说明
- 去重处理:先对
USERT+COMPANY+CREATIONDATE去重,排除同一天重复下单对连续天数判断的干扰 - 窗口函数计算日期差:按
USERT+COMPANY分区、日期排序,计算每条记录与前后同用户同企业记录的日期差 - 标记连续记录:如果当前记录和上一条/下一条同企业记录的日期差为1,标记为
Y,否则为N - 关联原表:通过左连接保留原表所有原始记录,包括同一天的重复下单,确保这些记录能继承对应的标记
数据集示例(部分)
USERT;CREATIONDATE;COMPANY 45921390;20230629;NANREC 45921390;20230628;NANREC 45921390;20230630;NANREC 49148167;20230604;INGMBH 49148167;20230605;INGMBH 49148167;20230606;INGMBH 49148179;20230621;GK LGA 49148179;20230622;GK LGA 49148179;20230623;GK LGA 49148179;20230624;GK LGA
预期输出(带标记)
USERT;CREATIONDATE;COMPANY;flag 45921390;20230628;NANREC;Y 45921390;20230629;NANREC;Y 45921390;20230630;NANREC;Y 49148167;20230604;INGMBH;Y 49148167;20230605;INGMBH;Y 49148167;20230606;INGMBH;Y 49148179;20230621;GK LGA;Y 49148179;20230622;GK LGA;Y 49148179;20230623;GK LGA;Y 49148179;20230624;GK LGA;Y
内容的提问来源于stack exchange,提问作者Kiss Patrik
相关产品推荐
相关产品推荐

