开窗函数主要分为2类:

1.排序开窗函数:

rank() over(partition by xxx order by yyy)  //各分区按照yyy字段排序,如果yyy字段值一样,则rank值一样,且下一个序号为rank值加1,如1、2、2、3、4(假如分区一共有5条记录)

row_number() over(partition by xxx order by yyy)  //各分区按照yyy字段排序,即使yyy字段值一样,rank的值也不一样,从1一直往上加,如1、2、3、4、5

以上,partition by xxx 表示按照xxx字段分区(分区就是分组的意思),如果没有partition by子句的话,所有的记录当做一个分区。

2.聚合开窗函数:

sum(xxx) over(partition by yyy order by zzz)

count(1) over(partition by xxx order by yyy)

max(xxx) over(partition by yyy order by zzz)

min(xxx) over(partition by yyy order by zzz)

avg(xxx) over(partition by yyy order by zzz)

这5个聚合开窗函数用的时候再研究,粗略的看了一下各运行结果,跟平时的聚合函数有非常大的不同。

使用案例:

之前用group by分组时select的字段除了group by字段外,其他字段都要用聚合函数包起来(如果有的话),如count(1),sum(amount),max(created_date),这样对其他非分组字段的处理只能满足一些常规的需求,如分组查询created_date最大的那条记录

某红包项目

需求一:查询投保表中每个子红包最近一次的投保失败记录

with r as (
select child_redpacket_id, max(updated_date) from red_packet_customerinfo
where insure_status = -1
group by child_redpacket_id
)
select rpc.child_redpacket_id, rpc.error_msg, rpc.updated_date from red_packet_customerinfo rpc
where (rpc.child_redpacket_id, rpc.updated_date) in (select * from r)
order by rpc.updated_date desc, rpc.child_redpacket_id

需求二:查询投保表中每个子红包最近两次的投保失败记录

用group by 绞尽脑汁也想不出来怎么写,但是用row_number() over(...) 相当简单

row_number() over(partition by xxx order by yyy),按照xxx字段分组并且按照yyy字段排列,默认是升序排列,后面跟上desc则是降序排列

这样每一条记录都会增加一个row_number虚拟字段(可以重命名为任意字段),每一组row_number都是从1开始往上累计,且排序是按照yyy字段严格排序的。

这样满足需求二的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

最新文章

  1. Linux下安装JDK和Eclipse
  2. Bloomberg面经准备: Josephus problem
  3. 批量过滤POST GET数据
  4. Spring绑定表单数据
  5. xdebug调试php程序
  6. GBDT原理实例演示 2
  7. HDU 4941 Magical Forest --STL Map应用
  8. JAVA 判断一个字符串是不是一个合法的日期格式
  9. windbg命令分类与概述
  10. linux复制多个文件到文件夹
  11. profile工具
  12. hdoj 1789 Doing Homework again
  13. C# 数组的应用
  14. UIPickView之自定义生日键盘和城市键盘
  15. android用户界面之ScrollView教程实例汇总
  16. Pyspark 使用 Spark Udf 的一些经验
  17. 窗口,父窗口parentwindow,所有者窗口ownerwindow
  18. leetcode208
  19. Python-第三方模块requests快速入手
  20. mysql 存储过程 有数据修改 没数据插入

热门文章

  1. BZOJ 4034[HAOI2015]树上操作(树链剖分)
  2. 生日蜡烛——第七届蓝桥杯C语言B组(省赛)第二题
  3. Delphi XE7 GPS控件android下的新变化
  4. delphi 金额大小写转换函数
  5. Js杂谈-单体模式
  6. [web] [vscode] 自定义语言缩进
  7. C# 中使用using的三种方法
  8. dynamic的好处
  9. 动态内存分配存在的问题(内存空洞)------c++程序设计原理与实践(进阶篇)
  10. utp