【问题标题】:problems selecting max of an avg in SQL在 SQL 中选择最大值的问题
【发布时间】:2018-04-14 16:43:24
【问题描述】:

我不明白为什么我在 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

【问题讨论】:

  • 你想要什么结果?你用的是什么数据库?
  • 每个teacherid是1行还是1行?
  • 每个teacherid 1行,我在底部做了一点解释:stackoverflow.com/a/49833871/2354957

标签: mysql group-by max average


【解决方案1】:

平均学生人数是“GVA”,这似乎很奇怪,但没关系。

在 ANSI SQL 中,您可以使用 fetch first 子句:

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

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,我认为这应该可行

       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
    

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 2022-09-23
      • 1970-01-01
      • 2016-03-06
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2013-05-26
      相关资源
      最近更新 更多