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

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

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

  1. id pno hours
  2. 123456789 1 32.50
  3. 123456789 2 7.50
  4. 333445555 2 10.00
  5. 333445555 3 10.00
  6. 333445555 10 10.00
  7. ...

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

  1. pname pno location
  2. ProductX 1 Bellaire
  3. ProductY 2 Sugarland
  4. ProductZ 3 Houston
  5. Computerization 10 Stafford
  6. ...

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

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

返回结果:

  1. pname hours
  2. ProductX 52.50
  3. ProductY 37.50
  4. ProductZ 50.00
  5. Computerization 55.00
  6. Reorganization 25.00
  7. Newbenefits 55.00

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

piok6c0g

piok6c0g1#

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

  1. SELECT p.pname, sub.hours
  2. FROM company.project p
  3. INNER JOIN
  4. (
  5. SELECT pno, SUM(hours) AS hours
  6. FROM company.works_on
  7. GROUP BY pno
  8. ) sub
  9. ON p.pnumber = sub.pno
  10. WHERE
  11. sub.hours = (SELECT SUM(hours) FROM company.works_on
  12. GROUP BY pno ORDER BY SUM(hours) DESC LIMIT 1);

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

  1. SELECT pname, hours
  2. FROM
  3. (
  4. SELECT p.pname, sub.hours,
  5. RANK() OVER (PARTITION BY p.pname ORDER BY sub.hours DESC) rnk
  6. FROM company.project p
  7. INNER JOIN
  8. (
  9. SELECT pno, SUM(hours) AS hours
  10. FROM company.works_on
  11. GROUP BY pno
  12. ) sub
  13. ) t
  14. WHERE rnk = 1;
展开查看全部

相关问题