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如何找到小于平均值的计数的主要内容,如果未能解决你的问题,请参考以下文章