【问题标题】:SQL Row containing max value per another variableSQL 行包含每个变量的最大值
【发布时间】:2021-04-02 01:40:44
【问题描述】:

我有一个基本的 SQL 查询,但笔记本电脑快要跳出窗口了,哈哈

我有一张桌子

ID,     StudentID,      Mark,     DateAdded
1       2               78        19/02/2020 
2       4               43        19/02/2020
3       2               23        19/02/2020
4       5               91        20/03/2020
5       7               56        20/03/2020      
6       9               24        20/03/2020 
7       10              56        12/05/2020
8       10              23        12/05/2020
9       10              78        12/05/2020
10      9               23        12/05/2020

我要提取的是每个唯一学生 ID 的最高分的整行,例如

ID.     StudentID.      Mark.     DateAdded
1       2               78        19/02/2020
2       4               43        19/02/2020
4       5               91        20/03/2020
5       7               56        20/03/2020
6       9               24        20/03/2020
9       10              78        12/05/2020

谢谢

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 如果学生在两个不同的日期获得相同的最高分,预期结果是什么?
  • MariaDB 和添加的最高日期,但这并不是真正的问题
  • 如果您发现任何有用的问题,请标记答案。

标签: sql datetime mariadb subquery greatest-n-per-group


【解决方案1】:

您可以使用解析函数row_number如下:

Select * from
(select t.*,
       Row_number() over (partition by studentid order by mark desc) as rn
  From t)
Where rn= 1

【讨论】:

    【解决方案2】:

    你可以通过 group by 来实现你的结果,但是你不能通过这种方式获得 ID 和 DateAdded 列。

       SELECT StudentID, MAX(Mark)
         FROM YourTable
     GROUP BY StudentID
    

    【讨论】:

      【解决方案3】:

      只需使用函数MAX(),然后使用GROUP BY

      SELECT StudentID, MAX(Mark) from tableOne GROUP BY studentID
      

      这是一个小提琴链接:

      http://sqlfiddle.com/#!9/dd8e77/3

      【讨论】:

        【解决方案4】:

        我将推荐一个相关的子查询:

        select t.*
        from mytable t
        where t.mark = (select max(t1.mark) from mytable t1 where t1.studentid = t.studentid)
        

        为什么:

        • 可移植性:这适用于所有版本的 MySQL/MariaDB,而窗口函数是在 MySQL 8.0/MariaDB 10.2.2 中引入的

        • 效率:您希望在(studentid, mark) 上建立索引(或者更好的是studentid, mark desc),因此子查询可以利用它。在许多情况下,相关子查询是此类 top-1-per 中最有效的方法小组问题。

        【讨论】:

          猜你喜欢
          • 2022-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-12
          • 1970-01-01
          • 2012-03-11
          • 1970-01-01
          • 2023-04-04
          相关资源
          最近更新 更多