开窗函数(Window Function)是数据库查询语言SQL中的一种特殊函数,主要用于对数据的子集进行复杂的计算,这个子集被称为窗口。窗口可以是数据中的连续行或按某种规则定义的行集合。开窗函数通常与排序和分组操作一起使用,以便进行累计、排名等计算。开窗函数主要用于数据分析、报告生成等场景。
开窗函数在SQL中的常见应用包括:
1. **RANK() 和 DENSE_RANK()**:为窗口中的每一行分配一个排名。RANK()在遇到相等值时会跳过下一个排名,而DENSE_RANK()则不会。
例如:为某个员工表中的员工按薪水排名。
```sql
SELECT employee_id, salary, RANK() OVER (ORDER BY salary DESC) as rank
FROM employees;
```
2. **ROW_NUMBER()**:为窗口中的每一行分配一个唯一的编号。
例如:为所有员工按入职日期分配行号。
```sql
SELECT employee_id, hire_date, ROW_NUMBER() OVER (ORDER BY hire_date) as row_num
FROM employees;
```
3. **LAG() 和 LEAD()**:获取窗口内前一行或后一行的值。这对于分析数据的趋势或差异非常有用。
例如:获取每个员工的前一个员工的薪水。
```sql
SELECT employee_id, salary, LAG(salary) OVER (ORDER BY employee_id) as previous_salary
FROM employees;
```
4. **SUM(), AVG() 等聚合函数与开窗函数的结合**:在窗口中对数据进行累计或平均计算。这常用于计算移动平均或累计总和等。
除了上述函数外,还有许多其他的开窗函数和选项可以使用,具体取决于使用的数据库系统。使用开窗函数时,通常会结合使用ORDER BY子句来定义窗口的排序和范围。另外,还可以使用PARTITION BY子句将结果集分成多个窗口,在每个窗口上独立执行计算。