row_number() over(...)函数
Posted koushr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了row_number() over(...)函数相关的知识,希望对你有一定的参考价值。
row_number() over(...)简直就是个吊炸天的函数。
之前用group by分组时select的字段除了group by字段外,其他字段都要用聚合函数包起来(如果有的话),如count(1),sum(amount),max(created_date),这样对其他非分组字段的处理只能满足一些常规的需求,如分组查询created_date最大的那条记录
以平安寿险红包项目举例
需求一:查询投保表中每个子红包最近一次的投保失败记录
需求二:查询投保表中每个子红包最近两次的投保失败记录
用group by 绞尽脑汁也想不出来怎么写,但是用row_number() over(...) 相当简单
需要说明的是row_number()是个函数,over()也是个函数,两者要在一起使用,单独使用哪一个都会报错的。
row_number() over(...)在over的括号中可以有3种写法:
1.只写partition by 某字段,按照某字段分组,每一条记录都会增加一个row_number虚拟字段,每一组row_number都是从1开始往上累计,1,2,3。。。,排序是按照记录的插入顺序排序的,没有按照某字段严格排序
2.只写order by 某字段,按照某字段排序,这个时候只排序不分组了,同样每一条记录都会增加一个row_number虚拟字段,按照插入顺序从1往上累加,也是没有按照某字段严格排序
3.partition by 某字段 order by 某字段,按照某字段分组并且按照某字段排列(默认是升序排列,最后面跟上desc则是降序排列),这样每一条记录都会增加一个row_number虚拟字段,每一组row_number都是从1开始往上累计,且排序是按照某字段严格排序的。
这样满足需求二的sql就可以这样写:
with r as ( select rpc.*, row_number() over(partition by child_redpacket_id order by updated_date desc) from red_packet_customerinfo rpc where insure_status = -1 ) select r.child_redpacket_id, r.error_msg, r.updated_date from r where r.row_number <= 2 order by r.updated_date desc, child_redpacket_id
以上是关于row_number() over(...)函数的主要内容,如果未能解决你的问题,请参考以下文章
ROW_NUMBER() OVER()函数用法;(分组,排序),partition by
ROW_NUMBER() OVER()函数用法;(分组,排序),partition by
ROW_NUMBER() OVER()函数用法;(分组,排序),partition by