HIVE窗口函数
hive窗口函数
窗口函数是什么?
窗口函数指定了函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。
下面我们练习一些窗口函数。
准备数据:
name,orderdate,cost
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94
OVER():
指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。
CURRENT ROW:当前行
n PRECEDING:往前n行数据
n FOLLOWING:往后n行数据
UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点
select *,
sum(cost) over (), -- 所有的行相加
sum(cost) over(partition by name), -- 按name分组,组内数据相加
sum(cost) over (partition by name order by orderdate),
-- 按name分组,按照日期组内数据累加
sum(cost) over (partition by name order by orderdate
rows between unbounded preceding and current row ),
-- 跟上一条一样,由起点到当前行的聚合
sum(cost) over (partition by name order by orderdate
rows between 1 preceding and current row ),
-- 当前行和前面一行做聚合
sum(cost) over (partition by name order by orderdate
rows between 1 preceding and 1 following),
-- 当前行和前面一行及后面一行
sum(cost) over (partition by name order by orderdate
rows between current row and unbounded following)
-- 当前行及后面所有行
from business;

LAG(col,n,default_val):往前第n行数据
LEAD(col,n, default_val):往后第n行数据
NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。
select *,
ntile(5) over(order by orderdate) sorted
from business

RANK()
RANK() 排序相同时会重复,总数不会变
DENSE_RANK() 排序相同时会重复,总数会减少
ROW_NUMBER() 会根据顺序计算
数据准备
| name | subject | score |
|---|---|---|
| 孙悟空 | 语文 | 87 |
| 孙悟空 | 数学 | 95 |
| 孙悟空 | 英语 | 68 |
| 大海 | 语文 | 94 |
| 大海 | 数学 | 56 |
| 大海 | 英语 | 84 |
| 宋宋 | 语文 | 64 |
| 宋宋 | 数学 | 86 |
| 宋宋 | 英语 | 84 |
| 婷婷 | 语文 | 65 |
| 婷婷 | 数学 | 85 |
| 婷婷 | 英语 | 78 |
select *,
rank() over (partition by subject order by score desc),
dense_rank() over (partition by subject order by score desc ),
row_number() over (partition by subject order by score desc)
from score;


浙公网安备 33010602011771号