多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] > [参考](https://zhuanlan.zhihu.com/p/92654574) ## 概述 窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理 ``` <窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>) ``` <窗口函数>的位置,可以放以下两种函数: 1. 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。 2. 聚合函数,如sum. avg, count, max, min等 - 因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中 - partition子句可是省略 ## 专用窗口函数rank ![](https://img.kancloud.cn/13/e3/13e32a8a796ae5e54af353573d78fe0c_633x471.png) 每个班级内按成绩排名 ![](https://img.kancloud.cn/3b/7b/3b7b005f3911cb6f9016d69423c02d5e_633x474.png) 以班级“1”为例,这个班级的成绩“95”排在第1位,这个班级的“83”排在第4位 ``` select *, rank() over (partition by 班级 order by 成绩 desc) as ranking from 班级表 ``` ![](https://img.kancloud.cn/7b/bc/7bbcb78157e308b1a2cc9a6504e3d071_631x472.png) ## 其他专业窗口函数 专用窗口函数rank, dense_rank, row_number有什么区别呢? 它们的区别我举个例子,你们一下就能看懂: ``` select *, rank() over (order by 成绩 desc) as ranking, dense_rank() over (order by 成绩 desc) as dese_rank, row_number() over (order by 成绩 desc) as row_num from 班级表 ``` 结果 ![](https://img.kancloud.cn/5a/7e/5a7ede032d01b4195a3c6b280c88abb9_635x476.png) 1. rank函数:这个例子中是5位,5位,5位,8位,也就是如果有并列名次的行,会占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,4。 2. dense_rank函数:这个例子中是5位,5位,5位,6位,也就是如果有并列名次的行,不占用下一名次的位置。比3. 如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2。 row_number函数:这个例子中是5位,6位,7位,8位,也就是不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4。