什么是窗口函数?
简单来说就是 将 一个查询SQL 的结果集按指定的规则进行分区,每个分区可以看作是一个窗口,分区内的每一行,根据其所属分区内的行数据进行函数计算,获取计算结果,作为该行的窗口函数结果值
窗口函数和Group by的区别
-group by使用聚合函数,普通场景下的聚合函数是将多条记录聚合为一条(多到一)-窗口函数是每条记录都会执行,有几条记录执行完还是几条(多到多)
语法:
函数名(字段名) over(partition by <要分列的组> order by <要排序的列> rows between <数据范围>)
rows between 2 preceding and current row #本行和前面两行
rows between unbounded preceding and current row #本行和之前所有的行 #unbounded意为无限的
rows between current row and unbounded following # 本行和之后所有的行rows between 3 preceding and 1 following # 从前面三行和下面一行,总共五行
-- 当order by后面没有rows between时,窗口规范默认是取本行和之前所有的行
-- 当order by和rows between都没有时,窗口规范默认是分组下所有行
MySQL函数之——窗口函数
一、累计和:SUM(字段) over()
二、最大最小:MAX(字段)over()、MIN(字段)over()
三、移动平均:AVG(字段)over()
四、排名排序:Rank()over()
五、前后取值【相隔差】:LAG(字段,n)over()、LEAD(字段,n)over()
六、首位末位:first_value(字段)over()、last_value()over()
七、第N个:NTH_VALUE(expr,n)over()
八、分桶分箱(分等级)NTILE(n)over()
-- 窗口语法:函数名(字段名)over(子句)
【场景1】 累计和:sum(字段)over()
【场景2】最大最小:MAX(字段)over()、MIN(字段)over()
【场景3】移动平均:AVG(字段)OVER() ***重点理解这题****
【场景4】排名:RANK() OVER()
【场景5】前后取值:LAG(字段,n) OVER()、LEAD(字段,n) OVER()
【场景6】首位末位:FIRST_VALUE(字段) OVER()、LAST_VALUE(字段) OVER()
【场景7】第N个:NTH_VALUE(expr, n) OVER()
【场景8】分桶分箱:NTILE(n) OVER()