首页 > 解决方案 > 如何在 sql 中分组和排名,然后从表中选择其他列,特定组的所有行都应该在一起

问题描述

我想根据 id 列对行进行分组,并按另一列的总和排序。然后我需要将这些行与表中的所有列作为有序组。

这是我想要做的一个例子:

SELECT Studentname, 
       Subject, 
       Marks, 
       RANK() OVER(PARTITION BY Studentname ORDER BY Marks DESC) Rank
FROM ExamResult order by Studentname

结果:

Studentname Subject  Marks  Rank
Isabella    english  90     1
Isabella    Science  70     2
Isabella    Maths    50     3
Lily        Science  80     1
Lily        english  75     2
Lily        Maths    65     3
Olivia      english  95     1
Olivia      Science  60     2
Olivia      Maths    60     3

我需要的是按总和(标记)排序,然后将该学生的所有记录分组为一个实体。因为这里 Isabella、Lily 和 Olivia 的总分分别是 210、220 和 215。所以组的顺序应该是 Lily、Olivia 和 Isabella。

要求的结果:

Studentname Subject  Marks  Rank
Lily        Science  80     1
Lily        english  75     1
Lily        Maths    65     1
Olivia      english  95     2
Olivia      Science  60     2
Olivia      Maths    60     2
Isabella    english  90     3
Isabella    Science  70     3
Isabella    Maths    50     3

标签: sqlsql-servergroup-byrank

解决方案


您可以使用两个级别的窗口函数:

SELECT Studentname,  Subject,  Marks, 
       RANK() OVER(PARTITION BY Studentname ORDER BY Sum_Marks DESC) Rank
FROM (SELECT er.*,
             SUM(Marks) OVER (PARTITION BY StudentName) as sum_marks
      FROM ExamResult
     ) er
ORDER BY Studentname

推荐阅读