从SQL中的联接中选择持有最大值的多行

时间:2018-10-31 04:55:49

标签: mysql sql mysql-workbench

我在这里还阅读了多篇有关类似问题的文章,但似乎都没有答案。

我有一张表works_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,在works_on表中给出了每个相应项目编号(pno)的名称:

   pname           pno  location 

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

我正在尝试使用不使用SELECT TOP或LIMIT约束来获得总时数最高的项目的名称,因为我们不知道有多少个“ max”值。 / p>

我可以汇总小时数:

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
应该理想地返回

计算机化新收益,因为它们具有最高的合计小时数,但是我似乎无法执行MAX查询来获得此结果结果。

是否有一种解决方法,可以在不使用TOP或SORT / LIMIT约束的情况下选择最大结果?

1 个答案:

答案 0 :(得分:0)

在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;