推荐答案
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
表示在每个部门内独立计算排名。