关于使用COUNT与HAVING COUNT筛选重复ID及构造多统计字段单条SQL查询的技术咨询
嘿,我来帮你搞定这个多维度统计的需求!你想要用单条SQL一次性拿到总记录数,以及不同重复次数的id相关统计对吧?
首先,我们可以先通过子查询统计每个id_client的出现次数,再基于这个结果做聚合计算,就能得到你想要的多维度结果。这里分两种常见场景给你方案:
场景1:统计不同重复次数的id对应的总记录数
比如id1是所有出现2次的id的总记录数,id2是出现1次的id的总记录数,以此类推:
SELECT (SELECT COUNT(*) FROM client) AS All, -- 表中所有记录的总数 SUM(CASE WHEN cnt = 2 THEN cnt ELSE 0 END) AS id1, -- 出现2次的id的总记录数 SUM(CASE WHEN cnt = 1 THEN cnt ELSE 0 END) AS id2, -- 出现1次的id的总记录数 SUM(CASE WHEN cnt = 3 THEN cnt ELSE 0 END) AS id3 -- 出现3次的id的总记录数 FROM ( -- 先统计每个id的出现次数 SELECT id_client, COUNT(*) AS cnt FROM client GROUP BY id_client ) AS id_counts;
场景2:统计不同重复次数的id的数量
比如id1是出现2次的id有多少个,id2是出现1次的id有多少个:
SELECT (SELECT COUNT(*) FROM client) AS All, -- 表中所有记录的总数 COUNT(CASE WHEN cnt = 2 THEN 1 END) AS id1, -- 出现2次的id的数量 COUNT(CASE WHEN cnt = 1 THEN 1 END) AS id2, -- 出现1次的id的数量 COUNT(CASE WHEN cnt = 3 THEN 1 END) AS id3 -- 出现3次的id的数量 FROM ( -- 先统计每个id的出现次数 SELECT id_client, COUNT(*) AS cnt FROM client GROUP BY id_client ) AS id_counts;
逻辑说明
- 内层的
id_counts子查询会先给每个id_client计算出它在表中出现的次数cnt - 外层查询通过
CASE WHEN来过滤出对应重复次数的记录,再用SUM或COUNT做聚合,得到你需要的各个维度的统计值 - 如果需要统计其他重复次数(比如出现4次、5次),只要添加对应的
SUM/COUNT(CASE WHEN cnt = N THEN ... END)语句就行
内容的提问来源于stack exchange,提问作者Dmitriy_pechatnik
相关产品推荐
相关产品推荐

