【问题标题】:SQL query with Highest value with tie具有最高值的 SQL 查询与领带
【发布时间】:2020-07-08 09:10:09
【问题描述】:

我正在尝试编写一个查询,列出在每个部门中获得最高总学分的学生。我还必须在结果中包括并列的学生。 查询应返回与部门名称、学生姓名和他们获得的总学分的关系。

SELECT s.dept_name, s.name, s.max
FROM (SELECT dept_name, name, MAX(tot_cred) as max 
      FROM university.student GROUP BY dept_name) as s,
     university.student as t
WHERE s.name = t.name;

它给出了错误,我不知道如何处理关系。 如果我删除查询中的姓名部分,我已经设法获得了每个部门的最高学分(没有平局)

学生表由 ID、姓名、部门、​​总学分组成。

【问题讨论】:

  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 请提供示例数据和预期结果。
  • @TheImpaler 我已经添加了示例数据和预期结果

标签: mysql sql


【解决方案1】:

使用RANK()窗口函数:

SELECT t.dept_name, t.name, t.tot_cred
FROM (
  SELECT dept_name, name, tot_cred, 
    RANK() OVER(PARTITION BY dept_name ORDER BY tot_cred DESC) rn
  FROM university.student 
) t
WHERE t.rn = 1

如果您不能使用窗口函数,这是一种替代方法:

SELECT s.dept_name, s.name, s.tot_cred
FROM university.student s
INNER JOIN (
  SELECT dept_name, MAX(tot_cred) tot_cred
  FROM university.student
  GROUP BY dept_name
) t ON t.dept_name = s.dept_name AND s.tot_cred = t.tot_cred

或NOT EXISTS:

SELECT s.dept_name, s.name, s.tot_cred 
FROM university.student s 
WHERE NOT EXISTS (
  SELECT 1 FROM university.student
  WHERE dept_name = s.dept_name AND tot_cred > s.tot_cred  
)

【讨论】:

  • 它给出了语法错误...它在 MySQL 中可用吗?
  • MySql 8.0+ 可用
  • 我的版本是 8.0.18 但它给出了语法错误... :(
  • 查询本身在语法上是正确的。查看演示:db-fiddle.com/f/36dWp2tpZaDszvZu19txjd/0 所以不知道你是怎么用的。发布完整的错误消息。
  • 00:52:23 SELECT t.dept_name, t.name, t.tot_cred FROM (SELECT dept_name, name, tot_cred, RANK() OVER(PARTITION BY dept_name ORDER BY tot_cred DESC) AS rn FROM university.student ) AS t WHERE t.rn = 1 错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行 0.0016 秒处的 '(PARTITION BY dept_name ORDER BY tot_cred DESC) AS rn FROM university.student '附近使用正确的语法
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 2021-03-21
  • 2021-09-08
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2016-04-04
  • 2019-09-08
相关资源
最近更新 更多