1. 开窗函数基础概念解析
开窗函数(Window Function)是Oracle数据库中用于复杂数据分析的强大工具。与普通聚合函数不同,开窗函数能够在保留原始行数据的同时,对数据集进行分组计算。这种特性使其在报表统计、数据分析等场景中具有不可替代的价值。
开窗函数的核心语法结构为:分析函数 OVER([PARTITION BY 列] [ORDER BY 列] [窗口子句])。其中:
PARTITION BY定义分组规则,类似于GROUP BY但不会减少行数ORDER BY指定组内排序规则- 窗口子句(如
ROWS/RANGE BETWEEN)进一步限定计算范围
关键区别:普通聚合函数+GROUP BY会压缩行数为每组一行,而开窗函数会为每行返回计算结果,原始数据行数保持不变
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开窗函数专项练习
2.1 基础累计计算
sql复制-- 按薪资排序计算累计和
SELECT employee_id,
salary,
SUM(salary) OVER(ORDER BY salary) running_total
FROM employees;
这个查询会:
- 先按salary升序排列所有员工记录
- 对每一行计算从第一行到当前行的salary总和
- 结果集中会保留所有原始列
典型应用场景:计算销售业绩的月度累计、项目进度的百分比累计等。
2.2 分组内排序计算
sql复制-- 按部门分组后计算薪资排名
SELECT department_id,
employee_id,
salary,
RANK() OVER(PARTITION BY department_id ORDER BY salary DESC) as dept_salary_rank
FROM employees;
此查询会:
- 先按department_id分组
- 在每个部门内部按salary降序排列
- 计算每个员工在其部门内的薪资排名
- 使用RANK()函数处理相同薪资的情况(会产生排名间隙)
2.3 移动窗口计算
sql复制-- 计算当前行与前一行、后一行的薪资平均值
SELEC
