首页 > 解决方案 > Oracle SQL如何找到小于平均值的计数

问题描述

我的代码是这样的:

SELECT    
    number,
    name,
    count(*) as "the number of correct answer"
FROM
    table1 NATURAL JOIN table2
WHERE
    answer = 'T'
GROUP BY
    number,
    name
HAVING
    count(*) < avg(count(*))
ORDER BY
    count(*);

在这里我想找到计数小于每个组的平均计数的组,但是在这里我没有使用 HAVING 或 WHERE,有人可以帮助我吗?我怎样才能只选择1 name1 2因为计数的平均值是 (2+6+7)/3 = 5 并且只有 2 小于平均值。

number name count
1      name1 2
2      name2 6
3      name3 7

标签: sqloracleoracle-sqldeveloper

解决方案


我建议你永远不要使用自然连接。他们混淆了查询并使查询成为维护之夜。

您可以使用窗口函数:

SELECT t.*
FROM (SELECT number, name,
             COUNT(*) as num_correct,
             AVG(COUNT(*)) OVER () as avg_num_correct
      FROM table1 JOIN
           table2
           USING (?). -- be explicit about the column name
      WHERE answer = 'T'
      GROUP BY number, name
     ) t
WHERE num_correct < avg_num_correct;

与您的查询版本一样,这会过滤掉所有没有正确答案的组。


推荐阅读