Mysql 在SQL中选择平均值的最大值时出现问题
我不知道为什么在SQL中用max avg选择记录时遇到了一个愚蠢的问题 此查询将生成有问题的表:Mysql 在SQL中选择平均值的最大值时出现问题,mysql,group-by,max,average,Mysql,Group By,Max,Average,我不知道为什么在SQL中用max avg选择记录时遇到了一个愚蠢的问题 此查询将生成有问题的表: SELECT * FROM (SELECT MATRDOC AS TEACHERID FROM DOCENTE WHERE MATRDOC NOT IN (SELECT MATRDOC FROM CORSO WHERE AREA
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;
现在,我想用max'GVA'获取TEACHERID和COURSEID,因此我在查询的末尾添加了:
GROUP BY TEACHERID
HAVING MAX(GVA)
但它不起作用,我得到以下值:
TEACHERID COURSEID GVA
S12346 C9 40.3333
S12348 C7 123
学生的平均人数是GVA,这似乎很奇怪,但还行 在ANSI SQL中,可以使用fetch first子句: 并非所有数据库都支持先获取。常见的备选方案包括选择顶部和限制 编辑: 如果您想要每个教师的最大值,请使用行号:
这是所有ANSI标准语法,包括正确使用JOIN。如果我正确理解了您的问题,我认为这应该是可行的
SELECT teacherid, courseid, max(gva) ------*****changed
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
group by teacherid; -----*********added
你想要什么结果?您使用的是什么数据库?您希望每个教师ID有一行还是一行?每个教师ID有一行,我在底部做了一点解释:
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;
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;
SELECT teacherid, courseid, max(gva) ------*****changed
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
group by teacherid; -----*********added