概述: 窗口函数指的是 over()函数, 它可以结合特定的函数一起使用, 完成不同的功能.
目的、作用: 窗口函数 = 给表新增一列, 至于新增的内容是什么, 取决于窗口函数和什么函数一起使用.
格式: 能和窗口函数一起使用的函数 over(partition by 分组字段 order by 排序字段 rows between 起始行 and 结束行),能和窗口函数一起使用:
聚合函数: count(), sum(), max(), min(), avg()
排序函数: row_number(), rank(), dense_rank(), ntile()
其它函数: lag(), lead(), first_value(), last_value()
sum() + group by 一起使用.
select 列, sum(列) as 别名 from 表名 group by 列;
聚合函数 + 窗口函数一起使用.
细节:
如果写了partition by(表示分组): 则默认操作 组内所有的数据.
如果写了order by(表示排序): 则默认操作 组内第一行 至 当前行的数据.
select *, sum(列) over(partition by 列) from 表名;
select *, sum(列) over(partition by 列 order by 列) from 表名;
这里的排序函数指的是: row_number(), rank(), dense_rank(), 它们都可以做排名, 不同的是, 对相同值的处理结果.
例如: 数据是100, 90, 90, 60, 则:
row_number是: 1, 2, 3, 4,
rank: 1, 2, 2, 4,
dense_rank: 1, 2, 2, 3
--格式
select
*,
row_number() over (partition by 列 order by 列 desc ) as 别名 ,
rank() over (partition by 列 order by 列 desc ) as 别名,
dense_rank() over (partition by 列 order by 列 desc ) as 别名
from 表;
ntile(数字)表示几分之几, 里边的数字表示把数据分成几份, 如果不够分, 优先参考最小分区.
例如: 7条数据分成3份, 则最终结果为: 1, 1, 1 2, 2 3, 3
ntile(数字,表示分成几份) 采用均分策略, 每份之间的差值不超过1, 优先参考最小的那个部分, 即: 7分成3份, 则是: 3, 2, 2
-- 格式
select
*,
ntile(3) over (partition by 列 order by 列 desc )
from 表;
lag 用于统计窗口内往上第n行值需求: 显示用户上一次的访问时间.
lead 用于统计窗口内往下第n行值
first_value 取分组内排序后,截止到当前行,第一个值
last_value 取分组内排序后,截止到当前行,最后一个值