SQL技能 - 窗口函数
- 1. 排序函数
- 1.1. 不分组排序
- 1.2. 分组排序
- 2. 聚合函数实现滑动窗口计算
- 2.1. 常用聚合函数
- 2.2. 滑动行范围的常用表达
- 2.3. 示例
- 3. lag、lead函数求增长率(同比、环比)
窗口函数表达式:
function(arg) OVER ([PARTITION BY expression][ORDER BY expression [ASC|DESC]][frame])
1. 排序函数
排序函数 | 示例 | 备注 |
---|---|---|
row_number() | 1,2,3… | 序号不重复,序号连续 |
rank() | 1,2,2,4… | 序号可以重复,序号不连续 |
dense_rank() | 1,2,2,3… | 序号可以重复,序号连续 |
1.1. 不分组排序
select
score,
dense_rank() over(order by score desc) as `rank`
from scores
1.2. 分组排序
select c.department,c.employee,c.salary
from
(select
b.name as department,
a.name as employee,
a.salary,
rank() over(partition by departmentid order by salary desc) as salary_rank
from employee a
inner join department b on a.departmentid = b.departmentid) c where c.salary_rank = 1
2. 聚合函数实现滑动窗口计算
2.1. 常用聚合函数
聚合函数 | 说明 |
---|---|
COUNT(col) | 返回所有非空值的个数 |
AVG(col) | 返回平均值 |
SUM(col) | 返回总和 |
MAX(col) | 返回最大值 |
MIN(col) | 返回最小值 |
FIRST(col) | 返回第一个记录的值 |
LAST(col) | 返回最后一个记录的值 |
2.2. 滑动行范围的常用表达
{RANGE|ROWS} frame_start
{RANGE|ROWS} between frame_start AND frame_end
rows模式:按物理行来进行划分
range模式:按数值逻辑来进行划分
frame_start / frame_end的五种表达 | 说明 |
---|---|
UNBOUNDED PRECEDING | 从开始行 |
expression PRECEDING | 往前推n行(只适用于rows模式) |
CURRENT ROW | 当前行 |
expression FOLLOWING | 往后推n行(只适用于rows模式) |
UNBOUNDED FOLLOWING | 到结束行 |
默认:BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
2.3. 示例
3. lag、lead函数求增长率(同比、环比)
同比就是比去年同期,环比就是这个月比上个月,单位不一定是月,可以是任何时间单位。
同比计算方式:同比增长率 = (本期数 - 同期数) ÷ 同期数 * 100%
环比计算方式:环比增长速度 = (本期数 - 上期数) ÷ 上期数 * 100%
前后函数 | 说明 |
---|---|
lead(expression,n) | 返回当前行的后n行 |
lag(expression,n) | 返回当前行的前n行 |
求环比: