在sql中从连接中选择多个包含最大值的行

bxpogfeg  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(376)

我在这里读过多篇关于类似问题的帖子,但似乎没有一篇能回答我的问题。
我有一个表,works\u on,其中包含了员工参与项目的所有时间:

id     pno  hours

 123456789   1   32.50
 123456789   2    7.50
 333445555   2   10.00
 333445555   3   10.00 
 333445555  10   10.00
 ...

以及另一个表,project,给出了表中每个相应项目编号(pno)的名称:

pname           pno  location 

 ProductX           1   Bellaire 
 ProductY           2   Sugarland
 ProductZ           3   Houston
 Computerization   10   Stafford
...

我正在尝试获取聚合小时数最高的项目的名称,而不使用selecttop或limit约束,因为我们不知道有多少个“max”值。
我可以把时间加起来:

SELECT p.pname, sub.hours FROM company.project p
JOIN
    (SELECT w.pno, SUM(IFNULL(w.hours, 0)) AS hours FROM company.works_on w
     GROUP BY w.pno) AS sub
ON p.pnumber = sub.pno;

返回结果:

pname           hours      

 ProductX          52.50
 ProductY          37.50
 ProductZ          50.00
 Computerization   55.00
 Reorganization    25.00
 Newbenefits       55.00

i、 e,计算机化和newbenefits应该是理想的回报,因为他们有最高的聚合小时,但我似乎不能执行max查询,给我这个结果。
是否有解决方法来选择最大结果而不使用top或sort/limit约束?

piok6c0g

piok6c0g1#

如果没有分析函数的帮助,在mysql中很难做到这一点。有一种方法:

SELECT p.pname, sub.hours
FROM company.project p
INNER JOIN
(
    SELECT pno, SUM(hours) AS hours
    FROM company.works_on
    GROUP BY pno
) sub
    ON p.pnumber = sub.pno
WHERE
    sub.hours = (SELECT SUM(hours) FROM company.works_on
                 GROUP BY pno ORDER BY SUM(hours) DESC LIMIT 1);

如果您使用的是mysql 8+或更高版本,那么我们可以利用 RANK() :

SELECT pname, hours
FROM
(
    SELECT p.pname, sub.hours,
        RANK() OVER (PARTITION BY p.pname ORDER BY sub.hours DESC) rnk
    FROM company.project p
    INNER JOIN
    (
        SELECT pno, SUM(hours) AS hours
        FROM company.works_on
        GROUP BY pno
    ) sub
) t
WHERE rnk = 1;

相关问题