摘要:窗口函数(Window Function)是 SQL 中一种 在数据集的特定子集(窗口)上执行计算 的高级功能。它不会折叠原始数据行,而是为每一行返回一个计算结果,同时保留原始数据的完整细节。其核心是通过 `OVER` 子句定义窗口范围,支持动态分区、排序和定
大纲
2.测试实验表及数据准备
3.window function(窗口函数)的定义
窗口函数(Window Function)是 SQL 中一种 在数据集的特定子集(窗口)上执行计算 的高级功能。它不会折叠原始数据行,而是为每一行返回一个计算结果,同时保留原始数据的完整细节。其核心是通过 `OVER` 子句定义窗口范围,支持动态分区、排序和定义窗口范围。
┌────────── Window Function ────────────┐
▼▼
SELECT 函数名(参数) OVER AS 别名
├─ PARTITION BY 列1, 列2... ◀─ 分区(可选)
├─ ORDER BY 列3 [ASC|DESC] ◀─ 排序(可选)
└─ 窗口范围子句 ◀─ 动态范围(可选)
FROM 表;
1).同Group by 的对比
(1)查询结果的对比
window function 及Group by 查询结果示意
需求:
1.计算每个部门中员工最高的工资。2.计算每个部门中员工最高的工资并显示部门内有哪些员工。
(2)查询对比SQL
2)支持函数对比说明
4.为什么需要窗口函数?
用需求演进进行说明
5.window function 语法结构
6.window function 语法结构组成部分详细说明
1)window function
(1)window function有哪些
(2)function expression(函数表达式)
窗口函数的核心是具体的计算函数,用于定义在窗口范围内的计算逻辑。
2) partition 子句
将数据按指定列分成多个逻辑分区,函数在每个分区内独立计算
(1) 数据范围图示说明
(2)Partition by种类总结
(3)partition by 种类SQL举例说明
(1)计算公司全体员工的工资总计包括员工信姓名,职业及入职时间。
(2).计算每个部门的工资总计,包括员工姓名及入职时间。
(3).计算全体员工的工资总计及每个部门的工资总计及每个部门入职最早的员工入职时间。(在一条SQL里容许有不同的窗口函数)
(4).计算全体员工的工资总计及每个部门不同工种的工资总计及每个部门入职最早的员工入职时间以。(在一条SQL里容许不同的窗口函数有不同的分组粒度)
3) order 子句
(1)order 操作范围图示说明
对分区内的数据进行排序,决定窗口计算的逻辑顺序(分升序和降序两种)
生成上述表数据的SQL
(2)order by 总结
SQL举例说明
(1)计算公司内部员工工资从高到低的排名。需员工姓名,入职时间等
2.计算公司内部每个部门员工工资从高到低的排名。需员工姓名,入职时间等
4)frame子句
定义窗口的具体范围,即函数计算时使用的行集合。仅在包含 ORDER BY 时生效。
(1)数据范围图示说明
(2)Frame类型及边界说明
(3)以下以rows 类型为例分别对frame的上下边界进行说明并举例
N following 当前行之后的第 n 行(或值)
unbounded following 窗口的终点(分区最后一行)
N preceding 当前行之前的第 n 行(或值)
unbounded preceding 窗口的起点(分区第一行)
n preceding n following 当前行前后第几行
unbounded preceding unbounded following 分区的起点及最后一行
以上的frame仅仅是将函数计算的数据集范围进行了限定
7.练习题
通过以下练习语句及执行结果理解window function 的语法结构
需求:部门内入职时间靠近的三个员工中最高工资是多少
执行结果
以上说明:计算仅仅是在同一个window里进行frame的限定,并不考虑windows以外的数据
8.上下边界可以省略的场景
说明1: 仅仅对于上边界,下边界的current row 是可以省略
例如 ROWS BETWEEN 2 Preceding and Current row
省略后: ROWS 2 Preceding
SQL验证一下前面的说明
说明2:默认frame
1) 如果指定ORDER BY但省略框架,默认范围为 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。
2) 如果省略 ORDER BY,默认框架为整个分区(ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)。
故在使用window function 要特别注意如果over子句里有order by但不显式写frame时隐藏了默认的frame:ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
11.窗口函数限定与规则
1)执行顺序
在 WHERE、GROUP BY、HAVING 之后执行,在 ORDER BY 之前。
测试SQL
2)位置限制
允许:SELECT 列表、ORDER BY 子句(部分数据库)。
禁止:WHERE、GROUP BY、HAVING。
3)嵌套使用
不容许在window function 里嵌套window function 使用
4)GroupBY一起使用的限制
在同一条SQL里window function可以同Group by 一起使用,但需相同的column
5)性能优化
- 为 PARTITION BY 或 ORDER BY 的列建索引。
- 避免全分区窗口(如 UNBOUNDED FOLLOWING)。
12 总结
1).window function的定义:在窗口函数的数据集上执行计算,不折叠行,也保留原始字段的完整信息
2).window function 同group by 的区别
(1)window function 函数功能比group by 灵活且多很多
(2)数据分析时:group by 简单,但window function 复杂,灵活
(3)若要在group by 中用window function 则注意要相同的字段。
3).语法结构组成部分详细举例说明
window function + 窗口定义 over 子句(partition by +order by + frame)
4).window function 的一些限定
(1).嵌套不容许
(2).只能在select 和order by 中使用
(3).在条件过滤之后执行,在order by 之前。等
来源:小象科技论