推荐答案
Presto 支持多种窗口函数,主要包括以下几类:
聚合窗口函数:
SUM(): 计算窗口内某列的总和。AVG(): 计算窗口内某列的平均值。COUNT(): 计算窗口内某列的行数。MIN(): 计算窗口内某列的最小值。MAX(): 计算窗口内某列的最大值。
排名窗口函数:
ROW_NUMBER(): 为窗口内的每一行分配一个唯一的行号。RANK(): 为窗口内的每一行分配一个排名,相同值的行会有相同的排名,后续排名会跳过。DENSE_RANK(): 为窗口内的每一行分配一个排名,相同值的行会有相同的排名,但后续排名不会跳过。NTILE(n): 将窗口内的行分成n个桶,并为每一行分配一个桶号。
分析窗口函数:
FIRST_VALUE(): 返回窗口内某列的第一个值。LAST_VALUE(): 返回窗口内某列的最后一个值。LAG(): 返回窗口内某列的前一个值。LEAD(): 返回窗口内某列的后一个值。
累积窗口函数:
CUME_DIST(): 计算窗口内某列的累积分布。PERCENT_RANK(): 计算窗口内某列的百分比排名。
本题详细解读
窗口函数的基本概念
窗口函数(Window Function)是一种在 SQL 查询中用于对一组行进行计算的函数。与普通的聚合函数不同,窗口函数不会将多行合并为一行,而是为每一行返回一个值。窗口函数通常与 OVER 子句一起使用,OVER 子句定义了窗口的范围。
窗口函数的语法
窗口函数的基本语法如下:
function_name (expression) OVER (
[PARTITION BY partition_expression]
[ORDER BY sort_expression]
[frame_clause]
)PARTITION BY: 将数据分成多个分区,窗口函数在每个分区内独立计算。ORDER BY: 定义窗口内的排序顺序。frame_clause: 定义窗口的框架,即计算的范围。常见的框架包括ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW和ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING。
窗口函数的应用场景
窗口函数在数据分析中非常有用,常见的应用场景包括:
- 排名和分位数计算:如
ROW_NUMBER()、RANK()、DENSE_RANK()和NTILE()。 - 累积计算:如
SUM()、AVG()和CUME_DIST()。 - 前后值比较:如
LAG()和LEAD()。 - 首尾值获取:如
FIRST_VALUE()和LAST_VALUE()。
示例
以下是一个使用窗口函数的示例,计算每个部门的员工工资排名:
SELECT
department,
employee_id,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM
employees;在这个示例中,RANK() 函数为每个部门的员工按工资从高到低进行排名,PARTITION BY department 表示在每个部门内独立计算排名。