SQL按年份去重统计productcompanyID出现次数的方法
问题分析
你原有SQL的错误点在于:直接按productcompanyID分组统计所有匹配行的数量,写在SELECT后的DISTINCT不会对分组内的同一年份重复记录做过滤,因此统计的是该ID所有的记录条数,而非去重后的年份覆盖数,才会得到ID1为6、ID2为4的错误结果。
正确实现方案
你的统计规则核心是:同一productcompanyID在同一年份无论出现多少次,仅计数1次,本质是统计每个ID覆盖的不重复年份数量,有两种常用写法:
写法1:直接使用COUNT(DISTINCT)(最简洁)
直接在聚合时对年份字段去重计数,无需额外子查询:
SELECT productcompanyID, COUNT(DISTINCT yearName) AS appear_count FROM mydatabase GROUP BY productcompanyID;
执行后会直接返回你预期的结果:ID1计数为2(覆盖2001、2002两个年份),ID2计数为3(覆盖2001、2002、2003三个年份)。
写法2:先去重再统计(逻辑更直观,适合新手理解)
第一步先把(yearName, productcompanyID)的重复组合全部去掉,得到每个公司每年仅保留1条记录的中间结果,再基于中间结果分组计数:
-- 第一步:生成去重后的年份-公司ID对应关系 WITH dedup_result AS ( SELECT DISTINCT yearName, productcompanyID FROM mydatabase ) -- 第二步:按公司ID分组统计条数 SELECT productcompanyID, COUNT(*) AS appear_count FROM dedup_result GROUP BY productcompanyID;
该写法的执行结果和写法1完全一致,逻辑拆分更清晰,适合初学者理解去重的过程。
内容的提问来源于stack exchange,提问作者Vulcain
相关产品推荐
相关产品推荐

