文章目录
原文:Apache Spark SQL --- Window Functions
本分类按照 Spark SQL 官方目录函数顺序整理,共 9 个函数。
1、cume_dist
语法
sql
cume_dist()
说明
计算值在窗口分区内相对于其他值的累积分布位置。
示例
sql
> SELECT a, b, cume_dist() OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 0.6666666666666666
A1 1 0.6666666666666666
A1 2 1.0
A2 3 1.0
引入版本: 2.0.0
2、dense_rank
语法
sql
dense_rank()
说明
在分区内计算连续排名;相同值名次相同,不会跳号。
示例
sql
> SELECT a, b, dense_rank(b) OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 1
A1 1 1
A1 2 2
A2 3 1
引入版本: 2.0.0
3、lag
语法
sql
lag(input[, offset[, default]])
说明
返回窗口中当前行之前偏移指定行数的值,越界时返回默认值。
示例
sql
> SELECT a, b, lag(b) OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 NULL
A1 1 1
A1 2 1
A2 3 NULL
引入版本: 2.0.0
4、lead
语法
sql
lead(input[, offset[, default]])
说明
返回窗口中当前行之后偏移指定行数的值,越界时返回默认值。
示例
sql
> SELECT a, b, lead(b) OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 1
A1 1 2
A1 2 NULL
A2 3 NULL
引入版本: 2.0.0
5、nth_value
语法
sql
nth_value(input[, offset])
说明
返回窗口帧内从起点开始第 offset 个值。
示例
sql
> SELECT a, b, nth_value(b, 2) OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 1
A1 1 1
A1 2 1
A2 3 NULL
引入版本: 3.1.0
6、ntile
语法
sql
ntile(n)
说明
将窗口分区中的行分配到最多 n 个桶中。
示例
sql
> SELECT a, b, ntile(2) OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 1
A1 1 1
A1 2 2
A2 3 1
引入版本: 2.0.0
7、percent_rank
语法
sql
percent_rank()
说明
计算分区内每个值的百分比排名。
示例
sql
> SELECT a, b, percent_rank(b) OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 0.0
A1 1 0.0
A1 2 1.0
A2 3 0.0
引入版本: 2.0.0
8、rank
语法
sql
rank()
说明
计算分区内的排名;同分同名次,后续排名可能跳号。
示例
sql
> SELECT a, b, rank(b) OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 1
A1 1 1
A1 2 3
A2 3 1
引入版本: 2.0.0
9、row_number
语法
sql
row_number()
说明
按照分区内排序为每一行分配从 1 开始的唯一序号。
示例
sql
> SELECT a, b, row_number() OVER (PARTITION BY a ORDER BY b) FROM VALUES ('A1', 2), ('A1', 1), ('A2', 3), ('A1', 1) tab(a, b);
A1 1 1
A1 1 2
A1 2 3
A2 3 1
引入版本: 2.0.0