Mysql 在SQL中选择平均值的最大值时出现问题

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

我不知道为什么在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;
现在,我想用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