窗口函数的基本语法如下:
<窗口函数> over (partition by) <用于分组的列名>
order by <用于排序的列名>
<窗口函数>的位置,可以放以下两种函数:
专用窗口函数
序号函数:row_number() / rank() / dense_rank()
分布函数:percent_rank() / cume_dist()
前后函数:lag() / lead()
头尾函数:first_val() / last_val()
其他函数:nth_value() (用途:返回窗口中第N个expr的值,expr可以是表达式,也可以是列名)/nfile()(用途:将分区中的有序数据分为n个桶,记录桶号)/nfile()
聚合函数,如sum(), avg(), count(), max(), min()等
注意事项
窗口函数对where和group by子句处理后的结果进行操作,所以原则上窗口函数只能写在select子句中
聚合函数是将多条记录聚合为一条;而窗口函数是每条记录都会执行,查询结果并不会改变记录条数,有几条记录执行完还是几条。
普通聚合函数也可以用于窗口函数中,赋予它窗口函数的功能。
窗口函数的执行顺序(逻辑上的)是在FROM,JOIN,WHERE,GROUP BY,HAVING之后,在ORDER BY,LIMIT,SELECT,DISTINCT之前。它执行时GROUP BY的聚合过程已经完成了,所以不会再产生数据聚合。