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

如何在SQL中获取分组行计数的平均值?

分组计数的平均值:替代嵌套查询的方案

你当前的嵌套查询可以正常工作,但想要避免子查询,直接使用AVG(COUNT(*))会触发错误:聚合函数COUNT()使用不当,这是因为SQL不支持聚合函数直接嵌套调用——COUNT(*)是分组后的聚合结果,无法直接作为AVG的输入参数。

现有可行嵌套查询

SELECT AVG(cnt) FROM 
   (SELECT COUNT(*) AS 'cnt'
   FROM birds
   GROUP BY birdID
);

两种单查询实现方式

方式1:利用窗口函数

通过窗口函数先计算每个分组的计数,再对去重后的计数值求平均:

SELECT AVG(DISTINCT cnt) AS avg_group_count
FROM (
    SELECT COUNT(*) OVER (PARTITION BY birdID) AS cnt
    FROM birds
) AS temp;

这里的DISTINCT是关键:每个分组内的所有行都会返回相同的cnt,去重后才能得到每个分组的唯一计数,最终计算的平均值和原嵌套查询一致。

方式2:数学公式转换(更高效)

分组计数的平均值等价于总记录数 ÷ 分组数,因此可以直接计算:

SELECT COUNT(*) * 1.0 / COUNT(DISTINCT birdID) AS avg_group_count
FROM birds;

对于你的示例数据,总记录数是7,分组数是3,7÷3≈2.3,结果完全匹配需求。这种写法不需要分组或子查询,性能更优。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:38:27