需求描述:分析最近三个月每天排名前30的邮箱收件数量。
涉及到的表字段:发件时间,收件人。
一、ROW_NUMBER
表t查询出了3月每天不同类型邮箱收件量的降序排名,表t1通过ROW_NUMBER函数给每行数据添加序列号,select ROW_NUMBER() over(partition by t.send_dt order by t.num desc) as row_num,在表t1的基础上查询row_num<=30且order by t1.send_dt,t1.num desc。结果如下:
明显不是想要的结果,ROW_NUMBER()从1开始,按照顺序,生成分组内记录的序列,如果分组内排名相同会顺序标记,那么问题来了,在嵌套查询1个月内每天TOP30的量时ORDER BY 中不能有序列字段就会出现以上乱序问题。
二、RANK
通过RANK()函数统计的结果如下:
结果可以看出,RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位。
三、DENSE_RANK
通过DENSE_RANK()函数查询结果如下:
从结果可以看出,DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位,以上需求中选择使用DENSE_RANK。
不妥之处希望得到指正,谢谢!