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