按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个月的范围内(严格的一年内)
- 如果首个日期早于2020年1月1日,直接返回
- 格式统一:把统计数字转成字符串,确保和
IGNORE的输出格式一致
针对你的示例数据,这个查询会完美返回你期望的结果:
- ID 8103:两个后续版本都在一年内,计数2
- ID 7546:只有一个版本在一年内,计数1
- ID 4233:首个版本在2019年,标记为IGNORE
- ID 6626:没有后续版本,计数0
内容的提问来源于stack exchange,提问作者Omega
相关产品推荐
相关产品推荐

