hive窗口函数

窗口分析

窗口函数——聚合「sum\max\min\avg」

以SUM为例子:(max、min、avg同理)

sum(求和字段) over (partition by 分组字段 order by 排序字段 rows between unbounded preceding and current row) as pv1

关键字说明
如果不指定 rows between默认为从起点到当前行;
如果不指定 order by则将分组内所有值累加;

关键是理解ROWS BETWEEN含义,也叫做WINDOW子句:

关键字说明
preceding:往前3 preceding(前三行)
following:往后1 following(后一行)
current row:当前行current row(当前行)
关键字说明
unbounded preceding.(表示从前面的起点)
unbounded following.(表示到后面的终点)

窗口帧

作用是用于调整窗口大小

(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ( CURRENT ROW )| (UNBOUNDED | [num]) FOLLOWING)

UNBOUNDED :表示没有限制

num:具体行值或数据值

PRECEDING: 往前取

CURRENT ROW : 表示当前行

FOLLOWING:往后取值

-- 方式:
-- 1.按行限制窗口大小
--  ROWS BETWEEN num PRECEDING AND CURRENT ROW =>      往前取 num 行到当前行结束  
--  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW => 往前不限制行数 到 当前行结束
--  ROWS BETWEEN num PRECEDING AND num FOLLOWING => 往前 num行 往后 num 行 
-- 需求:对于各班级学生成绩按倒序排序,再取出前3名和后3名学生的平均分

SELECT
*
,avg(sum_score) over(partition by clazz order by sum_score ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING) as  avg_sum_score
FROM student_score

-- 2.按值限制窗口大小
-- 对于range来说必须要使用 order by 并对order by中的列计算其范围 

-- 需求:对于各班级学生成绩按倒序排序,再取出比当前学生分数多10分和少10分的学生人数个数

SELECT
*
,count(*) over(partition by clazz order by sum_score RANGE BETWEEN 10 PRECEDING AND 10 FOLLOWING) as  avg_sum_score
FROM student_score

窗口取行

  • lag/lead

LAG(col,n,default):往前第n行数据,default如果参数不给,那么默认返回NULL
LEAD(col,n,default):往后第n行数据

  • FIRST_VALUE /LAST_VALUE

FIRST_VALUE:取分组内排序后,截止到当前行,第一个值
LAST_VALUE:取分组内排序后,截止到当前行,最后一个值,对于并列的排名,取最后一个

窗口函数

非常重要

排名函数

  • row_number函数
  • rank/dense_rank
  • percent_rank/ cume_dist/NTILE

– 三者的不同点
① row_number() 排名连续 不重复
② dense_rank() 排名连续 且重复
③ rank() 排名不连续 且重复

hive中排名函数:https://blog.youkuaiyun.com/cc__cc___/article/details/134975068

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值