1)定义

在一组查询行上执行类似聚合的操作,但是不会将查询结果折叠为单行输出,而是为每个查询行生成一个结果

2)功能

处理复杂的报表统计分析场景,例如计算移动平均值、累计和、排名等

3)语法

窗口函数 over(partition by 分组字段 order by 排序字段 rows between 窗口范围)

rows between 2 preceding and current row # 取当前行和前面两行
rows between unbounded preceding and current row # 包括本行和之前所有的行
rows between current row and unbounded following # 包括本行和之后所有的行
rows between 3 preceding and current row # 包括本行和前面三行
rows between 3 preceding and 1 following # 从前面三行和下面一行,总共五行
# 当order by后面缺少rows语句时,窗口规范默认范围如下:
rows between unbounded preceding and current row.
# 当order by和rows语句都缺失, 窗口规范默认是 
rows between unbounded preceding and unbounded following

分类 函数 作用
序号函数 ROW_NUMBER()

添加序号

给结果集每行分配一个唯一的连续整数序号,序号不会重复

当有相同排序值时,每行都会有不同的序号。

RANK()

排名

给结果集中的每一行分配一个排名,排序值相同,跳过相同的排名

下一个排名会按照跳过的数量递增

DENSE_RANK()

排名

给结果集中的每一行分配一个排名,但不会跳过相同的排名

相同的排序值会有相同的排名,排名是连续的

分布函数 PERCENT_RANK()

计算某一行在结果集中的相对排名百分比

返回一个介于0和1之间的值,表示当前行在整个结果集中的相对位置

(rank-1)/(rows-1)

CUME_DIST()

计算某一行在结果集中的累积分布值

返回一个介于0和1之间的值,表示当前行在整个结果集中的累积分布比例

<=当前rank值的行数/总行数

前后函数 LAG(expr,n) 返回当前行的前n行的满足expr的值
LEAD(expr,n) 返回当前行的后n行的满足expr的值
头尾函数 FIRST_VALUE(expr) 返回第一个满足expr的值
LAST_VALUE(expr) 返回最后一个满足expr的值
其他函数 NTH_VALUE(expr,n) 返回第n个满足expr的值
NTILE (n) 将有序数据分为n个桶,记录等级数

将 employees 表数据按照工资(salary)降序进行排序,并使用 ROW_NUMBER | RANK | DENSE_RANK 函数为每个员工分配序号、排名、稠密排名

SELECT 
    employee_id, 
    last_name, 
    first_name, 
    department_id, 
    salary,
    ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num,
    RANK() OVER (ORDER BY salary DESC) AS rank_num,
    DENSE_RANK() OVER (ORDER BY salary DESC)  AS dense_rank_num
FROM employees;

案例:对每个部门的员工按照薪资排序,给部门名、序号、排名、稠密排名

SELECT
	departments.department_name,
	last_name,
	first_name,
	salary,
	ROW_NUMBER ( ) OVER (PARTITION BY employees.department_id ORDER BY salary DESC) AS 序号,
	RANK ( ) OVER ( PARTITION BY employees.department_id ORDER BY salary DESC) AS 排名,
	DENSE_RANK ( ) OVER (PARTITION BY employees.department_id ORDER BY salary DESC) AS 稠密排名 
FROM
	employees
	INNER JOIN departments ON employees.department_id = departments.department_id

案例:计算员工工资的排名百分比、累积分布比例

SELECT
    department_id,
    last_name,
    first_name,
    salary,
    RANK() OVER (ORDER BY salary) AS ranking,
    PERCENT_RANK() OVER (ORDER BY salary) AS 相对排名百分比,
    CUME_DIST() OVER(ORDER BY salary) AS 累积分布值
FROM employees

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐