您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何快速了解SQL窗口函数
## 一、什么是窗口函数?
SQL窗口函数(Window Functions)是SQL中一种强大的分析工具,它允许你在不减少行数的情况下对数据进行计算和分析。与聚合函数(如SUM、AVG)不同,窗口函数不会将多行合并为一行,而是为每一行返回一个计算结果。
### 核心特点:
- **保留原始行**:计算结果附加到每一行
- **定义数据窗口**:通过`OVER()`子句指定计算范围
- **灵活的分区**:支持按列分组计算(`PARTITION BY`)
- **排序控制**:可通过`ORDER BY`定义计算顺序
## 二、为什么需要窗口函数?
在数据分析中经常遇到这样的需求:
- 计算每行数据在其分组中的排名
- 计算移动平均值或累计求和
- 比较当前行与前后行的值
- 计算占比等高级指标
传统SQL需要通过自连接或子查询实现这些功能,而窗口函数提供了更高效简洁的解决方案。
## 三、窗口函数语法结构
```sql
函数名([参数]) OVER (
[PARTITION BY 列名1, 列名2...]
[ORDER BY 列名 [ASC|DESC]]
[frame_clause]
)
SUM(sales) OVER(PARTITION BY region)
AVG(price) OVER(ORDER BY date ROWS 2 PRECEDING)
-- 标准排名(有并列时会跳过后续名次)
RANK() OVER(ORDER BY score DESC)
-- 密集排名(有并列时不跳名次)
DENSE_RANK() OVER(ORDER BY score DESC)
-- 行号(无并列)
ROW_NUMBER() OVER(ORDER BY score DESC)
-- 计算百分位(0-1之间)
PERCENT_RANK() OVER(ORDER BY sales)
-- 返回分组百分比的分界值
NTILE(4) OVER(ORDER BY salary) -- 将数据分为4组
-- 访问前后行的数据
LAG(sales, 1) OVER(ORDER BY month)
LEAD(sales, 1) OVER(ORDER BY month)
-- 首尾值
FIRST_VALUE(price) OVER(PARTITION BY product)
LAST_VALUE(price) OVER(PARTITION BY product)
通过frame子句可以精确控制计算范围:
-- 当前行及前2行
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
-- 当前行前后各1行
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
-- 从分区开始到当前行(常用累计计算)
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
SELECT
salesperson,
month,
sales,
SUM(sales) OVER(PARTITION BY salesperson ORDER BY month) AS cumulative_sales,
RANK() OVER(ORDER BY sales DESC) AS sales_rank
FROM sales_data;
SELECT
employee_id,
department,
salary,
AVG(salary) OVER(PARTITION BY department) AS dept_avg,
salary - LAG(salary) OVER(PARTITION BY department ORDER BY hire_date) AS salary_diff
FROM employees;
❌ 混淆窗口函数与GROUP BY:窗口函数不减少行数
❌ 忽略ORDER BY对结果的影响:无ORDER BY时计算可能不按预期
❌ 错误理解frame范围:默认范围是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
掌握窗口函数可以显著提升SQL数据分析能力。建议从简单查询开始,逐步尝试复杂场景,实践中注意理解执行计划和性能影响。窗口函数是现代SQL不可或缺的技能,值得投入时间深入学习。 “`
(注:实际字数约1100字,可根据需要调整案例部分扩充到1150字)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。