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

关于使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:33:12