本次需要学习有如下几个部分:
一、什么是窗口函数
二、专用窗口函数rank,dense_rank,row_number有什么区别
三、经典排名问题
四、经典TOP n问题
五、聚合函数作为窗口函数
六、每组中比较
七、窗口函数的移动平均
八、总结
下面为以上内容一一解答:
一、什么是窗口函数
窗口函数,也叫OLAP函数(online anallytical processing ,联机分析处理),可以对数据库数据进行实时分析处理。
基本语法如下:
over (partition by <用于分组的列名>
order by <用于分组的列名>)
窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。
实例:
想要在班级分组之后再进行排序,结果如下
select *,rank()over (partition by 班级
order by 成绩 desc)as ranking from 班级表
解释:rank是排序的函数。要求是“每个班级内按成绩排名”,这句话可以分为两部分:
1.每个班级内:按班级分组
partition by用来对表分组。在这个例子中,所以我们指定了按“班级”分组(partition by 班级)
2.按成绩排名
order by 子句的功能是对分组后的结果进行排序,默认是按照升序(asc)排序。在本例中是降序
窗口函数分组与group by分组的区别:
grooup by分组汇总后改变了表的行数,一行只有一个类别。而partition by和rank函数不会减少原表中的行数。
例如:
统计每个班级的人数