MySQL-聚合函数的滥用

标签 mysql aggregate-functions

我一直在尝试运行以下命令:

select s.name, s.nr
from sub s
group by s.name
having (select count(s.name) from sub s group by s.name) > 
10 * (select avg(count(s.name)) from sub s group by s.name)

为了获取所有调用电话次数超过每个订阅者平均调用次数 10 倍的订阅者的姓名和电话号码。

我在 select avg(count(s.name)) from sub s group by s.name 中做错了什么?

最佳答案

可能是这样的:

select s.name, s.nr
from sub s
group by s.name, s.nr
having count(*) > 10 * (
    select avg(cnt)
    from (
        select count(*) as cnt
        from sub
        group by name, nr
     )x

您还可以使用单个(非嵌套)子查询获取平均计数:

select count(*) / count(distinct name, nr) from sub

将其解读为:所有行数/不同组数 - 这是每组的平均行数。

所以您的完整查询将是:

select s.name, s.nr
from sub s
group by s.name, s.nr
having count(*) > 10 * (select count(*) / count(distinct name, nr) from sub)

关于MySQL-聚合函数的滥用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50235704/

相关文章:

mysql - 如何在 MySQL 中选择字段具有最小值的数据?

mysql - 通过 LAN 连接到 mySQL

php - 在 OpenCart 中显示表中列的总和

sql - 字符串聚合组并计算一个值

mongodb - 该字段必须是累加器对象。 (该字段是日期字符串。)

mysql - SQL 仅选择列上具有最大值的行

sql - 在 Where 子句中使用 MAX() 聚合的 Select 语句

mysql - 使用 MySQL 子句 "Use index(' index_name')"using ActiveRecord 的最佳方式

Mysql左连接和求和

python - 如何在 SSH 关闭的情况下在 MySQL 中存储来自 Twitter Streaming API 的推文