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

按ID统计首个版本创建后一年内后续版本数量的SQL查询实现求助

解决版本数量统计的SQL问题

我来帮你搞定这个统计问题,先说说你现有SQL的几个问题:

  • 用年份差判断是否在一年内不准确——比如2020-11-20的首个版本,2021-03-30的版本虽跨年份但仍在一年内,你的逻辑会漏掉;反过来2020-01-01的首个版本,2021-01-02的版本已超一年,但年份差为1,会被错误计入。
  • 未处理首个版本早于2020年的IGNORE标记
  • 没考虑只有单个版本的情况(比如ID 6626应该返回0)

下面是修正后的SQL,用公共表表达式先拿到每个ID的首个创建日期,再精准判断每个版本是否符合规则:

WITH id_first_date AS (
    SELECT 
        ID,
        MIN(CreationDate) AS first_creation_date
    FROM MYTABLE
    GROUP BY ID
)
SELECT 
    t.ID,
    CASE
        WHEN i.first_creation_date < DATE '2020-01-01' THEN 'IGNORE'
        ELSE CAST(COUNT(
            CASE 
                WHEN t.CreationDate > i.first_creation_date 
                     AND t.CreationDate <= ADD_MONTHS(i.first_creation_date, 12)
                THEN 1 
            END
        ) AS VARCHAR)
    END AS Count
FROM MYTABLE t
JOIN id_first_date i ON t.ID = i.ID
GROUP BY t.ID, i.first_creation_date
ORDER BY t.ID;

逻辑拆解:

  • CTE获取首个日期:通过id_first_date公共表表达式,计算每个ID的最早版本创建日期,这是后续判断的基础。
  • 关联表数据:把原表和CTE关联起来,让每一行版本数据都能拿到对应ID的首个日期。
  • 分情况处理:
    • 如果首个日期早于2020年1月1日,直接返回IGNORE
    • 否则,统计满足两个条件的版本:创建日期晚于首个版本(排除自身),且在首个日期加12个月的范围内(严格的一年内)
  • 格式统一:把统计数字转成字符串,确保和IGNORE的输出格式一致

针对你的示例数据,这个查询会完美返回你期望的结果:

  • ID 8103:两个后续版本都在一年内,计数2
  • ID 7546:只有一个版本在一年内,计数1
  • ID 4233:首个版本在2019年,标记为IGNORE
  • ID 6626:没有后续版本,计数0

内容的提问来源于stack exchange,提问作者Omega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:37:40