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

如何在SQL中实现跨12个月的条件标记与滞后检查

按ID跟踪过去12个月内X≠C的标记方案

嘿,我来帮你搞定这个需求!你需要给每条记录生成一个Flag,标记同ID下该记录过去12个月范围内是否存在X不等于'C'的情况,Flag=1表示存在,0表示不存在对吧?

先看一下你的原始数据表:

DataDtIDXY
1.1.101C7
2.1.101C5
3.1.101C4
4.1.101C8
5.1.101C1
6.1.10132
7.1.10167
8.1.101C7
1.1.102C7
2.1.102C7
3.1.10237
4.1.102C7

解决方案(SQL实现)

我们可以用窗口函数来实现这个逻辑,核心是给每个ID划分时间窗口(过去12个月到当前记录),然后在窗口内判断是否有X≠'C'的记录。以下是通用的SQL代码(不同数据库可能需要微调日期区间写法,比如MySQL用INTERVAL 12 MONTH,PostgreSQL用INTERVAL '12 months'):

SELECT
    DataDt,
    ID,
    X,
    Y,
    -- 在过去12个月的窗口内,判断是否存在X≠'C'的记录,存在则Flag=1,否则0
    MAX(CASE WHEN X != 'C' THEN 1 ELSE 0 END) OVER (
        PARTITION BY ID
        ORDER BY DataDt
        RANGE BETWEEN INTERVAL '12 months' PRECEDING AND CURRENT ROW
    ) AS Flag
FROM your_table_name;

代码解释

  • PARTITION BY ID:按ID分组,确保我们只在同一个ID的范围内计算标记
  • ORDER BY DataDt:按日期排序,保证时间窗口的顺序逻辑正确
  • RANGE BETWEEN INTERVAL '12 months' PRECEDING AND CURRENT ROW:定义当前记录往前推12个月的时间范围作为计算窗口
  • MAX(CASE WHEN X != 'C' THEN 1 ELSE 0 END):在窗口内只要有一条X≠'C'的记录,MAX就会返回1,否则返回0,正好对应我们需要的Flag值

完整期望输出结果

按照这个逻辑,最终的输出表格会是这样:

DataDtIDXYFlag
1.1.101C70
2.1.101C50
3.1.101C40
4.1.101C80
5.1.101C10
6.1.101321
7.1.101671
8.1.101C71
1.1.102C70
2.1.102C70
3.1.102371
4.1.102C71

内容的提问来源于stack exchange,提问作者I.m.rich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:25:28