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

标签 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 <> '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

query output

现在我想获取最大“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 TOPLIMIT

编辑:

如果您想要每个教师的最大值,请使用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/

相关文章:

python pandas 仅对一个类别应用 if 语句和 groupby

python - Pandas :按两列分组,将第一列组中的第一个值相加

mysql - 查询小调查做基准测试

oracle - Oracles MAX函数的大O是什么?

php - POST undefined index php

mysql - php中的联合SQL查询

php - 迁移到新的 MYSQL 服务器会破坏使用 codeigniter 制作的网站

php - PDO 替代 mysql_ 获取字段信息

c - 子数组中的最大和

MySQL : How to get latest row on optional where clause using group by?