MySQL5.0版本,如何分组后组内排名 ,或者如何分组后,分别取组内的前几个值呢?

发布时间:2023年12月19日

MySQL5.0版本,如何分组后组内排名 ,或者如何分组后,分别取组内的前几个值呢?

? MySQL5.0版本,不支持像8.0那样的排名函数,那我们如果需要分组后组内排名,或者分组后分别取组内的前几个值的话,只能自己实现,没有现成的函数可用.

题目:现有一组数据,有三列,分别为year,project,value, 需要对这组数据按照year,item进行分组,每组内按照value值降序排列,取每组内的前10个值。

下面用两种方法实现。

方法一:使用自关联即可

? 分组后,按照value值排序,取组内的前10个值,范例脚本如下:

select 
	 year
	,project
	,value
from table1 t1
where (
	select
    	count(distinct value)
    from table1 t2
    where t2.year=t1.year and t2.project=t1.project 
    and t2.value>=t1.value
)<=10
order by value desc;

方法二:使用条件判断语句(case when或者if),添加临时变量

知识点:
1.MySQL中,使用@定义一个变量,如:@y,@i.
2.MySQL中,使用:=给变量赋值,如:@y:=year,意思是变量y的值为year这列对应的值;
如@y:=2023,意思是变量y的值为2023.
3.MySQL中,使用case when或IF做条件判断
case when year=2023 then value else null end
意为:当year为2023年时,显示对应的value值,否则为null,结尾必须加end表示结束.
IF(A,B,C)
意为:如果条件A成立,则执行B,否则执行C.

范例脚本如下:

select year
		,item
		,value
		,case when @p=project and @y=year then @r:=r+1
			else @r:=1
		end rk
		,@p:=project
		,@y:=year
from(
	select year
    		, project
    		, value
    from table
    where year >=2016
    group by project,year
    order by year desc,(value+0) desc
) t1,(select @r:=0,@p:=0,@y:=0) r
	

要注意:上面脚本中的value值,源文本中是文本类型的,不是数值类型,因此,如果你想要按照大小降序或升序排序,必须要把它转化为数值类型才能排序(自己踩坑,大家注意避免)。(value+0)就是转化为数值类型的其中一种方式,也可以用cast 转化,这里不多介绍。

参考文章链接:https://www.jianshu.com/p/98c272b5d764

文章来源:https://blog.csdn.net/weixin_43242845/article/details/135017691
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。