You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询需求:识别会员交易间隔超180天的休眠状态

问题分析与修正方案

原代码存在两个核心错误,导致无法正确识别休眠会员:

  1. DATEDIFF(day, TransactionDate, TransactionDate) 计算的是同一日期的天数差,结果永远为0,不可能满足>180的条件
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:24:51