如何在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
相关产品推荐
相关产品推荐

