SQL Server中添加Lookup列判断客户30天内是否复购
SQL Server:判断客户30天内是否有后续交易的解决方案
针对你的需求,这里提供两种SQL Server下的实现方案,覆盖不同场景的准确性需求:
方法一:使用LEAD()窗口函数(快速获取下一笔交易)
LEAD()窗口函数可以按客户分组、按交易日期排序,直接获取同一客户的下一笔交易日期,再通过DATEDIFF判断间隔是否≤30天:
SELECT Customer_ID, Transaction_ID, [Transaction Date], CASE -- 获取同一客户的下一笔交易日期,判断间隔天数 WHEN DATEDIFF(day, [Transaction Date], LEAD([Transaction Date]) OVER (PARTITION BY Customer_ID ORDER BY [Transaction Date])) <= 30 THEN 'Yes' ELSE 'No' END AS [Return within 30 days (Yes/No)] FROM db.transaction;
说明:
PARTITION BY Customer_ID确保只在同一客户的交易中查找后续记录ORDER BY [Transaction Date]保证按交易时间顺序获取下一笔记录- 如果客户只有唯一一笔交易,
LEAD()会返回NULL,此时CASE会返回No,符合逻辑
方法二:使用EXISTS子查询(覆盖所有后续交易,更准确)
如果需要判断当前交易日期后30天内是否存在任何其他交易(而非仅紧接的下一笔),用EXISTS子查询更准确,它会检查同一客户的所有后续交易:
SELECT t1.Customer_ID, t1.Transaction_ID, t1.[Transaction Date], CASE WHEN EXISTS ( SELECT 1 FROM db.transaction t2 WHERE t2.Customer_ID = t1.Customer_ID AND t2.Transaction_ID <> t1.Transaction_ID -- 排除当前交易本身 AND t2.[Transaction Date] > t1.[Transaction Date] -- 只看后续交易 AND DATEDIFF(day, t1.[Transaction Date], t2.[Transaction Date]) <= 30 ) THEN 'Yes' ELSE 'No' END AS [Return within 30 days (Yes/No)] FROM db.transaction t1;
说明:
- 即使下一笔交易超过30天,但再下一笔在30天内,该方法也会正确返回
Yes - 用
SELECT 1是子查询的最优写法,无需返回实际数据,仅判断存在性
注意事项
- SQL Server中带空格的列名(如
Transaction Date)必须用方括号[]包裹,避免语法错误 - 如果交易日期包含时间部分,
DATEDIFF(day, ...)会忽略时间差仅计算天数;若需要精确到小时/分钟,可将day替换为hour/minute等单位
内容的提问来源于stack exchange,提问作者azCats
相关产品推荐
相关产品推荐

