sql - 它说的 SQL 代码在 (MAX(AVG(winRate))) 中不能有聚合函数
问题描述
SELECT Teams_ID
FROM Players P, Heros H
WHERE P.Heros_ID = H.ID
GROUP BY Teams_ID
HAVING AVG(winRate)=(
SELECT MAX(AVG(winRate))
FROM Players P, Heros H
WHERE P.Heros_ID = H.ID
GROUP BY Teams_ID
);
解决方案
您必须将其编写为两个单独的SELECT
子句:
SELECT Teams_ID
FROM Players P, Heros H
WHERE P.Heros_ID = H.ID
GROUP BY Teams_ID
HAVING AVG(winRate)=(
SELECT MAX(avgWinRate)
FROM (SELECT AVG(winRate) as avgWinRate
FROM Players P, Heros H
WHERE P.Heros_ID = H.ID
GROUP BY Teams_ID
) as t
);
这清楚地表明 theMAX
并不意味着GROUP BY
ing Teams_ID
。
您可能还希望 a) 查看显式连接语法 b) 如果您的 RDBMS 支持它,请查看窗口聚合以避免重复查询。
如果您的数据库支持,这就是我更喜欢的:
select *
from (
select *,ROW_NUMBER() OVER (ORDER BY AvgWinRate desc) rn
from (
SELECT Teams_ID,AVG(winRate) OVER (PARTITION BY Teams_ID) as AvgWinRate
FROM Players P inner join Heros H
ON P.Heros_ID = H.ID
) t
) u
where rn = 1
这也更自然地扩展/组合更大的查询。
推荐阅读
- android - 在 Android (API 19) 中启动时反应本机应用程序崩溃
- spring-boot - Spring boot 如何让 Thymeleaf 网页和 REST API 具有不同的身份验证方案
- android - 底部 VSTACK 图像到视频的 FFMpeg 错误
- python-3.x - 如何使用 python 自动化 ms 团队频道上的消息发送过程?
- css - iOS上滚动网格下方的IONIC 4固定插槽不起作用
- azure - Get-AzSubscription 不工作,但 Get-AzureRMSubscription 工作
- docker - 替换 spring/tomcat docker 映像中的占位符属性
- c++ - QListWidget 行相互重叠
- google-app-engine - 在 Google Cloud Platform 中解释成本数据
- ios - 使用 Firebase Analytics,我将如何在 iOS 上使用浅色模式和深色模式跟踪/查看用户?