Oracle SQL如何找到小于平均值的计数

Posted

技术标签:

【中文标题】Oracle SQL如何找到小于平均值的计数【英文标题】:Oracle SQL how to find count less than avg 【发布时间】:2020-11-05 15:18:24 【问题描述】:

我的代码是这样的:

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

【问题讨论】:

【参考方案1】:

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

你可以使用窗口函数:

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;

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

【讨论】:

【参考方案2】:

我会将您当前的查询逻辑放入 CTE,然后标记过程中的平均计数:

WITH cte AS (
    SELECT number, name, COUNT(*) AS cnt,
           AVG(COUNT(*)) OVER () AS avg_cnt
    FROM table1
    NATURAL JOIN table2
    WHERE answer = 'T'
    GROUP BY number, name
)

SELECT number, name, cnt AS count
FROM cte
WHERE cnt < avg_cnt;

这里我们使用AVG() 函数作为分析 函数,窗口是整个聚合表。这意味着它将找到所有组中每个组的平均计数(聚合后)。窗口函数(几乎)总是最后计算。

【讨论】:

以上是关于Oracle SQL如何找到小于平均值的计数的主要内容,如果未能解决你的问题,请参考以下文章

绘制象限图以根据 X 和 Y 的平均值区分 4 组中的人口并找到最终计数

获取 Oracle SQL 的 13 周移动平均值

如何通过 SQL 查询找到组结果的平均值?

如何平均时间间隔?

如何在 Spark SQL 中找到分组向量列的平均值?

SQL如何仅在组遵循某些规则时才找到许多组总和的平均值