我在这里还阅读了多篇有关类似问题的文章,但似乎都没有答案。
我有一张表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约束的情况下选择最大结果?
答案 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;