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函数的基本用法

ROW_NUMBER() OVER()函数用法;(分组,排序),partition by

ROW_NUMBER() OVER()函数用法;(分组,排序),partition by

ROW_NUMBER() OVER()函数用法;(分组,排序),partition by

MySQL - ROW_NUMBER() OVER()函数用法详解(分组排序)

ROW_NUMBER() OVER() 函数用法详解 (分组排序,多例子)