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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:09:26