mysql5.7使用变量进行分组排名并筛选

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql5.7使用变量进行分组排名并筛选相关的知识,希望对你有一定的参考价值。

概述

mysql到8.0之后就有rank和desc_rank函数了,但是在5.7没这玩意,想实现一个分组排名得靠自己手撸了.

分组排名

student表就id/姓名/分数/班级几个字段,加上class表就id/name两个字段
需求是查询每个班级分数排名前三的所有人(不是3个人是所有人)

SELECT
@last_class := st.class,
CASE
		
	WHEN
		st.class = @last_class THEN
		CASE
				
				WHEN @score = st.score THEN
				@rank 
				WHEN ( @score := st.score ) IS NOT NULL THEN
				@rank := @rank + 1 
			END 
	ELSE @rank := 1 
END rank,
st.* 
FROM
	student st,(
	SELECT
		@score := NULL,
		@rank := 0,
		@last_class := NULL 
	) a 
ORDER BY
	st.class,
	st.score desc

结果

筛选

#EXPLAIN
SELECT
	a.id AS studentId,
	NAME,
	a.class,
	a.score 
FROM
	(
	SELECT
	@last_class := st.class,
	CASE
			
		WHEN
			st.class = @last_class THEN
				CASE
					
					WHEN @score = st.score THEN
					@rank 
					WHEN ( @score := st.score ) IS NOT NULL THEN
					@rank := @rank + 1 
					
				END 
		ELSE @rank := 1 
	END rank,
	st.* 
FROM
	student st,(
	SELECT
		@score := NULL,
		@rank := 0,
		@last_class := NULL 
	) aa 
ORDER BY
	st.class,
	st.score DESC 
	) a
	
	where a.rank <= 3

结果

以上是关于mysql5.7使用变量进行分组排名并筛选的主要内容,如果未能解决你的问题,请参考以下文章

怎么循序渐进写出分组排名

使用条件和排名进行分组的 Python/Pandas 实现

麻烦高手看下下面这个sql语句,为啥groupby了后,还能接个having 呢?

mysql5.7 mysql8窗口函数分组排序并在组内编号

在按另一个变量分组的 r 数据表中排名值

R_Studio(学生成绩)对两个班级学生成绩进行集合,重新计算学生综合测评成绩并对学生按综合测评成绩进行排名