序言
对于排序分析,应用的业务分析场景很多,例如所有销售大区的TOP5、按具体规则对数据集进行重新排序编号等,这些业务场景采用分析函数中排序函数,将很方便简单。
当前常用的排序类分析函数包括:row_number()、rank()、dense_rank(),这三个函数都可应用在排序场景中,但 又有些许不同。
排序函数之row_number()
特点:对分组后的排序结果进行递增编号,出现同值的也是递增处理。
函数表达式如下:
row_number() over(partition by column1 order by column2)
解释为:生成 按column1分组,column2排序时的顺序编号,是连续递增的。当column2出现相同值的时候,也会递增,该情况不适用于同值并列排名的情况。
举例如下:
如上图,是原始数据列,按org_id和item_id排序,用默认rownum作为编号。 从该脚本可看出,rownum是先根据查询结果加编号,再对查询结果进行排序,所以rownum并不是按排序结果进行编号。
现在使用row_number()对结果进行分组排序:
如上图,查询结果则变为按type分组且按item_id排序后,按顺序进行递增编号。 但该方式存在的问题在于,如果要求item_id相同的行序号要求一致,此时row_number()将无法满足该需求,此时将引入rank()和dense_rank()。
排序函数rank()和dense_rank()
rank()特点:按分组后的排序结果进行递增编号,如出现相同值则序号一致,但相邻出现的不同值序号将从rown+N开始(rown为前一个值的序号,N为前一个值相同的个数)。
举例如下:
如上图,1310有2个相同行,因此序号均为1,到了1312则从1+2开始编序号。
dense_rank()特点:和rank()相似,按分组后的排序结果进行递增编号,如出现相同值则序号一致,但相邻出现的不同值序号将从rown+1开始。
举例如下:
如上图,1310有2个相同值,因此序号均为1,到了1312则从2开始编序号。
总结
1.row_number()应用于不区分同值排序的业务场景;
2.rank()&dense_rank()应用于区分同值排序的业务场景,至于用rank和dense_rank,则要看对同值排序后对序号递增方式的具体要求来定。
有了上述三个函数,对于日常公司分析大区销售排名、销售代表排名、部门费用项排名等等,将会非常的方便快捷。