sql - 如何在 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
解决方案
您可以使用两个级别的窗口函数:
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
推荐阅读
- list - 删除元组列表,但将冲突保留为列表
- regex - Apache 标头编辑上的正则表达式搜索和替换
- node.js - node.js https server.listen 抛出 getaddrinfo ENOTFOUND example.com
- hadoop - 可以将 hdfs 文件从 hadoop 集群 KERBEROS 复制到其他集群而不是 KERBEROS 吗?
- android - 无法解决:com.android 和 gradle 项目同步失败
- sql - Oracle SQL - 将一个多行查询列除以另一个
- ruby - 在 Rspec 中编写匹配器
- multithreading - 如何编程多个处理器内核?
- postgresql - 更改日期格式,列是文本数据类型
- c - 用于 Windows 10 的 MSYS2 中的 Link -static GTK+-2.0 程序(使用 mingw64,而不是 mingw32)