我不明白为什么我会遇到在 SQL 中选择具有 max avg 的记录的愚蠢问题。
相关表是由以下查询生成的:
SELECT *
FROM (SELECT MATRDOC AS TEACHERID
FROM DOCENTE
WHERE MATRDOC NOT IN (SELECT MATRDOC
FROM CORSO
WHERE AREA <> 'BASI DI DATI')) DOC,
(SELECT C.CODCORSO AS COURSEID,
MATRDOC AS TEACHERID,
AVG(NUMSTUDENTI) AS GVA
FROM CORSO C, LEZIONE L
WHERE C.CODCORSO = L.CODCORSO
GROUP BY C.CODCORSO, MATRDOC) L
WHERE DOC.TEACHERID = L.TEACHERID;
输出如下:
TEACHERID COURSEID GVA
S12346 C9 40.3333
S12346 C3 213
S12346 C11 88
S12348 C7 123
S12348 C5 79
S12348 C13 82.5
现在我想获取最大“GVA”的TEACHERID和COURSEID,所以我在查询末尾添加:
GROUP BY TEACHERID
HAVING MAX(GVA)
但它不起作用,我获得这些值:
TEACHERID COURSEID GVA
S12346 C9 40.3333
S12348 C7 123
最佳答案
学生的平均人数是“GVA”,这似乎很奇怪,但没关系。
在 ANSI SQL 中,您可以使用首先获取
子句:
SELECT C.CODCORSO AS COURSEID, MATRDOC AS TEACHERID, AVG(NUMSTUDENTI) AS GVA
FROM CORSO C JOIN
LEZIONE L
ON C.CODCORSO = L.CODCORSO
GROUP BY C.CODCORSO, MATRDOC
ORDER BY GVA DESC
FETCH FIRST 1 ROW ONLY;
并非所有数据库都支持FETCH FIRST
。常见的替代方案包括SELECT TOP
和LIMIT
。
编辑:
如果您想要每个教师的最大值,请使用ROW_NUMBER()
:
SELECT *
FROM (SELECT C.CODCORSO AS COURSEID, MATRDOC AS TEACHERID, AVG(NUMSTUDENTI) AS GVA,
ROW_NUMBER() OVER (PARTITION BY TEACHERID ORDER BY AVG(NUMSTUDENTI) DESC) as seqnum
FROM CORSO C JOIN
LEZIONE L
ON C.CODCORSO = L.CODCORSO
GROUP BY C.CODCORSO, MATRDOC
) cl
WHERE seqnum = 1
ORDER BY GVA DESC;
这都是 ANSI 标准语法,包括 JOIN
的正确使用。
关于mysql - 在 SQL 中选择平均值的最大值时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49833783/