技术文摘
MySQL 按组区分后获取每组前几名的 SQL 写法
2025-01-14 23:08:22 小编
MySQL 按组区分后获取每组前几名的 SQL 写法
在 MySQL 数据库的实际应用中,我们常常会遇到需要按组区分并获取每组前几名数据的情况。这种需求在数据分析、排行榜生成等场景中十分常见。下面就为大家详细介绍实现这一功能的 SQL 写法。
假设我们有一个学生成绩表 student_scores,包含字段 id(学生编号)、student_name(学生姓名)、class(班级)、score(成绩)。现在我们要获取每个班级成绩排名前三的学生信息。
一种常见的实现方式是使用子查询和 DENSE_RANK() 窗口函数。窗口函数可以为分区内的每一行数据分配一个排名值,方便我们筛选出每组的前几名。
具体的 SQL 语句如下:
WITH RankedScores AS (
SELECT
id,
student_name,
class,
score,
DENSE_RANK() OVER (PARTITION BY class ORDER BY score DESC) AS rank
FROM
student_scores
)
SELECT
id,
student_name,
class,
score
FROM
RankedScores
WHERE
rank <= 3;
在上述代码中,首先使用 WITH 子句创建了一个名为 RankedScores 的临时结果集。在这个临时结果集中,通过 DENSE_RANK() 窗口函数按照 class 进行分区,并在每个分区内按照 score 从高到低排序,为每一行分配一个排名 rank。
然后,在外部查询中从 RankedScores 临时结果集中筛选出 rank 小于等于 3 的数据,即每个班级成绩排名前三的学生信息。
还有一种方法是使用自连接来实现。这种方法的核心思路是通过多次自连接,比较同一班级内学生的成绩,统计出成绩比当前学生高的人数。如果这个人数小于 3,那么该学生就是班级内成绩排名前三的。
SELECT
s1.id,
s1.student_name,
s1.class,
s1.score
FROM
student_scores s1
WHERE
(SELECT COUNT(*)
FROM student_scores s2
WHERE s1.class = s2.class AND s1.score < s2.score) < 3
ORDER BY
s1.class, s1.score DESC;
这种写法相对复杂一些,但同样可以达到获取每组前几名的目的。在实际应用中,我们可以根据数据库的性能、数据量以及个人编程习惯来选择合适的方法。掌握这些 SQL 写法,能够帮助我们更加高效地处理数据,满足各种复杂的业务需求。
- 王甲佳探讨O2O主导权归属:品牌企业还是平台企业?|V课堂第12期
- 黄峥嵘:企业 IT 架构与原则要求在当前经济环境下 | V 课堂第 11 期
- 陈广乾讲解大数据在企业的落地之道 | V课堂第10期
- 金吉光解读工业4.0与中国制造2025关系 | V课堂第8期
- 张得红:于互联网+制造中探寻工业 4.0 时代微蓝海 | V 课堂第 7 期
- 姚乐谈互联网+时代转型变革 | V课堂第9期
- 王晓冬:工业互联网中智慧与机器的相遇 | V 课堂第 4 期
- 51CTO江苏特约记者站及“智造+”专栏亮相
- 李劲宝:借互联网+构建大健康全产业链 | V 课堂第 2 期
- 徐斌:互联网+时代 大数据推动产业竞争力重塑 | V 课堂第 3 期
- 朱东:怎样穿越没有硝烟的战场?|V课堂第1期
- “智造+”专家资源库专家风貌
- 耿峰:数字化工厂实战分享 | 峰会第七轮
- 十种可能毁掉网站体验的设计错误
- 李英文谈工业4.0下Dell流动数据管理 峰会第四波