什么是窗口函数?
窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
窗口函数有什么用?
实际工作中,我们会常常遇到group by 后根据聚合起来的每组进行排名,求topN,累加等等问题
基本语法
<窗口函数>over (partition by <需要在哪类组别内比较的列名>order by <用于排序的列名>
详解
1、专用窗口函数 rank、dense_rank、row_number等等。
2、聚合函数,sum、avg、count、max、min等等。
举个例子
select *,
rank() over (partition by 姓名
order by 充值金额 desc) as ranking
from 订单表
表示的是按每个人的充值金额进行倒序排序,充值金额最大的那一笔排名第一。
partition by 指的是按姓名分组
order by 指的是按金额进行排序,可加asc、desc
为什么要有窗口函数呢?
虽然我们常常通过聚合能够将源数据汇总成少量的几行,一行只表示一个类别,只能跨类别比较,每个类别里面的数据都被忽略了。但有了窗口函数,我们可以不改变原表行数,进行组内比较。
常用的函数区别
##专用函数
1、rank()over(partition by 班级 order by 成绩 desc )
2、dense_rank over (partition by 班级 order by 成绩 desc )
3、 row_number() over (partition by 班级 order by 成绩 desc )
第一种:遇到同分的会表示成同一排名,下一分会跳过同分数量的排名。
第二种:遇到同分的会表示成同一排名,下一分会延续下一个排名。
第三种:遇到同分会以碰到的第一个记为排名,其他同分会顺延到下一排名。
如图: