mysql组内取前
mysql组内取前的几种写法
题目:按照性别分组,各取组内分数前三名同学
测试数据脚本
1 | SET NAMES utf8mb4; |
1. 场景一 (不管是否有并列排名只取分数最高的前三名同学)
1.1 方法1 利用分组和聚合函数
1 | SELECT |
1.2 自定义变量排名
1 | SELECT |
1.3 mysql8.0 利用 rank() over() 函数
1 | select id,name,sex,score from ( |
注意: 在这种不考虑并列排名的情况下如果只是输出结果的人数固定,则需要考虑在并列排名的情况下,输出的附加条件。比如一共取三个人,但是并列第二名的就有四个,如何输出,需要附加条件。
2.场景二 (并列排名不影响后续排名名次,按照名次输出,不考虑输出人数)
2.1 自定义变量排名
1 | SELECT id,name,sex,score |
2.2 MySQL8.0 利用dense_rank() over ()
1 | select id,name,sex,score from ( |
总结:组内取前的写法应该还有很多方式,欢迎各位大佬补充,指正。
遇到如下报错的时候也可以考虑上面的写法:
This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’ mysql
在leetcode 题库内也有类似的题目《部门工资前三高的所有员工》
Original author: Geng
Original link: https://zhongzhongbaby.github.io/2019/08/29/mysql组内取前/
Copyright Notice: Please indicate the source of the reprint (must retain the author's signature and link)