码迷,mamicode.com
首页 > 其他好文 > 详细

row_number() over(...)函数

时间:2017-09-04 01:03:11      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:count   项目   需要   div   举例   where   desc   group   括号   

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(...)函数

标签:count   项目   需要   div   举例   where   desc   group   括号   

原文地址:http://www.cnblogs.com/koushr/p/5873407.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!