窗口函数(Window Function)是GaussDB这类关系型数据库中强大的工具,它能对查询结果集的一个子集(窗口)进行计算,在分析数据时极为有用。
一、基本语法
1
2
3
4
5
function_name(arg1, arg2, ...) OVER (
[PARTITION BY partition_expression1, partition_expression2, ...]
[ORDER BY sort_expression1 [ASC | DESC], sort_expression2 [ASC | DESC], ...]
[frame_clause]
)
- function_name:窗口函数的名称,像SUM、AVG、ROW_NUMBER等。
- OVER:这是窗口函数的标志,用于定义窗口。
- PARTITION BY:把结果集划分成多个分区,窗口函数会在每个分区内独立计算。
- ORDER BY:在分区内对数据进行排序。
- frame_clause:可选参数,进一步限定窗口内的行范围。
二、窗口函数类型及示例
2.1 排名函数
ROW_NUMBER():为结果集中的每一行分配一个唯一的行号。
1
2
3
4
5
6
SELECT
id,
name,
score,
ROW_NUMBER() OVER (ORDER BY score DESC) as row_num
FROM students;
上述代码为students表中的每一行按score降序分配一个唯一的行号。
2.2 聚合函数
SUM():计算分区内某列的总和。
1
2
3
4
5
6
SELECT
department,
employee_name,
salary,
SUM(salary) OVER (PARTITION BY department) as total_department_salary
FROM employees;
上述代码按department对employees表进行分区,并计算每个部门的工资总和。
2.3 PARTITION BY
PARTITION BY
是窗口函数中一个关键的子句,它会把结果集分割成不同的组,每个组就是一个分区。窗口函数会对每个分区内的数据分别进行计算,而不是对整个结果集进行统一计算。这有助于你在每个分区内进行特定的统计或分析。
1
2
3
4
5
6
7
SELECT
column1,
column2,
-- 使用窗口函数,按照column1进行分区
window_function(column3) OVER (PARTITION BY column1 ORDER BY column2) as result
FROM
your_table;
在上述语法中,PARTITION BY column1
把结果集按照column1的值进行分区,ORDER BY column2
则在每个分区内对数据按照column2进行排序,window_function(column3)
会在每个分区内对column3 执行相应的窗口函数计算。