一直以为mysql的分组排序支持很弱,今天才发现也是一样很强大的,在oracle上面能够使用的函数,在mysql这里也是能够得到支持的。
分类后再排序(可加序号):这个对于需要取每个分类的top几非常的好用
测试表 test:
: row_number() ,作用是生产连续的序号
: lead(n,m,z) ,n是你要环比的字段,m是环比的步长,z是在最后一条记录无法环比的时候,填充的填充值
代码样例:
select
id_,
name1_,
name2_,
row_number() over w as "在name1_下的排名",
lead(name2_,1,0) over w as "相邻的上一条数据那name2_",
cnt_
from test
window w as (partition by name1_ order by cnt_ asc)
可以看到,分别在name1_下,都生成了各个分类的排名序号
将环比的值,提取到跟记录保持在一行,也可直接计算
对此类分组分区函数,mysql支持也是蛮强大的,曾经我开始也是很苦逼的把两张千万级别的etl调度执行记录日志相互关联查环比上次执行时间,结果导致一个sql要跑将近一个小时才能出来,后面通过官网找到了相关的lead()函数,使用了之后立马提升到20s+就执行完(当然,立马涉及到增量加工日志的就不细说),有兴趣的可以去mysq官网了解一下相关解说
官网参考链接:
https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html