分析函数又名窗口函数,也叫OLAP函数(OnLine Analytical Processing)意思是对数据库数据进行实时分析处理。
语法:
<窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用列清单>)
窗口函数大体可以分为以下两种
① 能够作为窗口函数的聚合函数(SUM、AVG、COUNT、MAX、MIN)
② RANK、DENSE_RANK、ROW_NUMBER 等专用窗口函数
⚪RANK函数——用来计算记录排序
PARTITION BY 能够设定排序的对象范围。
ORDER BY 能够指定按照哪一列、何种顺序进行排序。可以通过关键字ASC/DESC 来指定升序和降序。省略该关键字时会默认按照ASC,也就是升序进行排序。
小结:PARTITION BY 在横向上对表进行分组,而ORDER BY决定了纵向排序的规则。
窗口函数兼具之前我们学过的GROUP BY 子句的分组功能以及ORDER BY 子句的排序功能。但是,PARTITION BY 子句并不具备GROUP BY 子句的汇总功能。
通过PARTITION BY 分组后的记录集合称为窗口。此处的窗口并非“窗户”的意思,而是代表范围。各个窗口在定义上绝对不会包含共通的部分。
❤ 无需指定PARTITION BY的情况
PARTITION BY 并不是必需的,即使不指定也可以正常使用窗口函数。
当不指定PARTITION BY 时,和使用没有GROUP BY 的聚合函数时的效果一样,也就是将整个表作为一个大的窗口来使用。
● RANK函数
计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
例)有3 条记录排在第1 位时:1 位、1 位、1 位、4 位……
● DENSE_RANK函数
同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。
例)有3 条记录排在第1 位时:1 位、1 位、1 位、2 位……
● ROW_NUMBER函数
赋予唯一的连续位次。
例)有3 条记录排在第1 位时:1 位、2 位、3 位、4 位……
使用RANK 或ROW_NUMBER 时无需任何参数,只需要像RANK ()或者ROW_NUMBER() 这样保持括号中为空就可以了。这也是专用窗口函数通常的使用方式,请大家牢记。
窗口函数只能书写在SELECT 子句之中,不能在WHERE 子句或者GROUP BY 子句中使用。
以“自身记录(当前记录)”作为基准进行统计,就是将聚合函数当作窗口函数使用时的最大特征。