首页 > 解决方案 > 计算 SQL 中每一行的 MAX

问题描述

我有这个表:

对于每个 facolta,我只想获得完成 orelez 的最大数量和 orelez 数量的 Docenza 的 id:

id_docenzaP  facolta1   max(orelez)
id_docenzaQ  facolta2   max(orelez)
...
id_docenzaZ  facoltaN   max(orelez)

我怎样才能做到这一点?这就是我所做的:

SELECT DISTINCT ... F.nome, SUM(orelez) AS oreTotali
FROM Docenza D 
  JOIN Facolta F ON F.id = D.id_facolta
GROUP BY F.nome

我得到类似的东西:

 docenzaP  facolta1   maxValueForidP
 docenzaQ  facolta1   maxValueForidQ
 ...
 docenzaR  facolta2   maxValueForidR
 docenzaS  facolta2   maxValueForidS
 ...
 docenzaZ  facoltaN   maxValueForFacoltaN

我怎样才能只为每个 facolta 取最大值?

标签: sqlpostgresql

解决方案


这是未经测试的,并且由于您没有提供具有预期结果的示例数据,我无法确定它是否真的是您需要的。

这有点难看,我敢肯定有一些聪明的相关子查询方法,但我从来都不擅长这些。

SELECT st.focolta,
       s_orelez,
       TMP3.id_docenza
  FROM some_table AS st
 INNER
  JOIN (SELECT * 
          FROM (SELECT focolta,
                       s_orelez,
                       id_docenza,
                       ROW_NUMBER() OVER -- Get the ranking of the orelez sum by focolta.
                         ( PARTITION BY focolta
                               ORDER BY s_orelez DESC
                         ) rn_orelez
                  FROM (SELECT focolta,
                               id_docenza,
                               SUM(orelez) OVER -- Sum the orelez by focolta
                                ( PARTITION BY focolta
                                ) AS s_orelez 
                          FROM some_table
                       ) TMP
               ) TMP2 
         WHERE = TMP2.rn_orelez = 1 -- Limit to the highest rank value
       ) TMP3
    ON some_table.focolta = TMP3.focolta; -- Join to focolta to the id associated with the hightest value.

推荐阅读