SQL查询需求:识别会员交易间隔超180天的休眠状态
问题分析与修正方案
原代码存在两个核心错误,导致无法正确识别休眠会员:
DATEDIFF(day, TransactionDate, TransactionDate)计算的是同一日期的天数差,结果永远为0,不可能满足>180的条件MemberNumber = MemberNumber是恒成立的冗余条件,没有任何筛选意义
根据需求,分两种常见场景提供修正后的SQL:
场景1:标记单条交易与该会员上一次交易间隔超180天的记录
如果需要判断每笔交易和该会员的上一笔交易间隔是否超过180天,使用窗口函数LAG()获取上一笔交易日期:
SELECT [TransactionDate], [MemberNumber], [MemberName], [PrincipalAmount], [TransactionCategory], [TransactionChannel], [Service], [Product], CASE -- 按会员分组、交易日期排序,取上一笔交易日期计算间隔 WHEN DATEDIFF(day, LAG(TransactionDate) OVER (PARTITION BY MemberNumber ORDER BY TransactionDate), TransactionDate) > 180 THEN 'Dormant' ELSE 'Active' END AS Dormant_Flag FROM YourTableName; -- 替换为你的实际表名
场景2:标记会员最后一次交易距离当前日期超180天的所有记录
如果需要判断会员是否整体休眠(最后一次交易到现在超过180天),先计算每个会员的最后交易日期再关联原表:
WITH MemberLastTransaction AS ( -- 先获取每个会员的最后交易日期 SELECT MemberNumber, MAX(TransactionDate) AS LastTransactionDate FROM YourTableName GROUP BY MemberNumber ) SELECT t.[TransactionDate], t.[MemberNumber], t.[MemberName], t.[PrincipalAmount], t.[TransactionCategory], t.[TransactionChannel], t.[Service], t.[Product], CASE WHEN DATEDIFF(day, mlt.LastTransactionDate, GETDATE()) > 180 THEN 'Dormant' ELSE 'Active' END AS Dormant_Flag FROM YourTableName t JOIN MemberLastTransaction mlt ON t.MemberNumber = mlt.MemberNumber;
内容的提问来源于stack exchange,提问作者mclawler
相关产品推荐
相关产品推荐

