【问题标题】:SQL Order By clause with group带组的 SQL Order By 子句
【发布时间】:2014-08-20 19:25:17
【问题描述】:

所以我有一个SELECT查询,结果是这样的:

SELECT .... 
ORDER BY SCORE, STUDENT_NUMBER

STUDENT_NAME    STUDENT_NUMBER    SCORE     
----------------------------------------
  Adam              9              69
  Bob              20              76
  Chris            10              77
  Dave             14              77
  Steve             5              80
  Mike             12              80

但我想按 STUDENT_NUMBER 排序,但我希望它们按相同的分数分组:

STUDENT_NAME    STUDENT_NUMBER    SCORE     
----------------------------------------
  Steve             5              80
  Mike             12              80
  Adam              9              69
  Chris            10              77
  Dave             14              77
  Bob              20              76

所以现在数据按 STUDENT_NUMBER 排序,但如果有相同的 SCORE,则将它们分组(如下一行所示)。

可以用 ORDER BY 子句做到这一点吗?

【问题讨论】:

标签: sql sql-server sql-order-by


【解决方案1】:

排序似乎也可以描述为按每个分数的最小学生人数排序。您可以使用窗口函数来执行此操作。这是一个例子:

select <whatever>
from (select t.*, min(student_number) over (partition by score) as minsn
      from <whatever> t
     ) t
order by minsn, score, student_number asc;

您确实会问是否可以使用order by 完成此操作。我认为答案是“是”,使用子查询。它看起来像这样:

select <whatever>
from <whatever> t
order by (select min(t2.student_number)
          from <whatever> t2
          where t2.score = t.score
         ),
         score, student_number;

【讨论】:

  • 第二个答案正是我想要的。谢谢!
【解决方案2】:

您可以按该分数的最低学号排序,然后按学号排序:

SELECT STUDENT_NAME, STUDENT_NUMBER, SCORE 
FROM Scores s
ORDER BY (SELECT(MIN(STUDENT_NUMBER) FROM Scores WHERE SCORE = s.SCORE) ,
         STUDENT_NUMBER

【讨论】:

    【解决方案3】:

    我相信这可以解决您好奇的订购要求。不是按 Student_Number 排序,而是按给定分数的最小 Student_Number 排序。

    WITH v AS
    (
        SELECT t1.Student_Number, t1.Score,
        (
            SELECT MIN(Student_Number) FROM table1
            WHERE Score = t1.Score
        ) AS MinStudentNumber
        FROM table1 t1
    )
    SELECT Student_Number, Score FROM v
    ORDER BY MinStudentNumber, Score
    

    【讨论】:

      猜你喜欢
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多