sql - 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
解决方案
我建议你永远不要使用自然连接。他们混淆了查询并使查询成为维护之夜。
您可以使用窗口函数:
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;
与您的查询版本一样,这会过滤掉所有没有正确答案的组。
推荐阅读
- linux - 从管道在环境中注册 Linux VM 在 config.sh 中失败
- bash - 错误:每当我运行 yum 时,宏 % 具有非法名称 (%define)
- sql - 如何查找一个单元格是否出现一次或多次
- autodesk-forge - 编辑访问级别时,用户对项目的访问和权限已在 BIM 360 中删除
- python - 如何根据列的值对熊猫数据框中的列进行分类?
- node.js - 在 Vercel 上部署 NextJS 的 API 路由上使用 fileSystem
- bash - 读取日志文件,如果发生错误重启服务
- node.js - 如何通过 node express 服务器将 http 请求从 angular 重定向到 Web API?
- postgresql - 从交叉表函数外部的参数中获取值
- vespa - 有没有办法在 Vespa 中重用结构