Hive- 序列函数

数据集如下:

cookie1,2015-04-10,1
cookie1,2015-04-11,5
cookie1,2015-04-12,7
cookie1,2015-04-13,3
cookie1,2015-04-14,2
cookie1,2015-04-15,4
cookie1,2015-04-16,4
cookie2,2015-04-10,2
cookie2,2015-04-11,3
cookie2,2015-04-12,5
cookie2,2015-04-13,6
cookie2,2015-04-14,3
cookie2,2015-04-15,9
cookie2,2015-04-16,7

1、ntile

用法:
ntitle 函数主要是用于将整表数据进行切片分组,默认是对表在不做任何操作之前进行切片分组的,比如现在整个表有9行数据,你要切片分成3组ntile(3),那么就是第1-3行为一组,4-6行为一组,7-9行分为一组。

说明:
NTILE(n),用于将分组数据按照顺序切分成n片,返回当前切片值
NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
如果切片不均匀,默认增加第一个切片的分布

select
  cookieid,
  createtime,
  pv,
  ntile(2) over (partition by cookieid order by createtime) as rn1, --分组内将数据分成2片
  ntile(3) over (partition by cookieid order by createtime) as rn2, --分组内将数据分成2片
  ntile(4) over (order by createtime) as rn3 --将所有数据分成4片
from cookie.cookie2 
order by cookieid,createtime;

查询结果如下:
在这里插入图片描述
问题:统计一个cookid,PV最多的前1/3天。
思路:对每个cookid的pv 降序排,然后进行切片分组ntile(3)。

select 
cookieid,
createtime,
pv,
ntile(3) over(partition by cookid order by pv desc) as rn
from cook.cookie2;

取rn = 1的记录。

2、row_Number()
用法 :
从1开始,按照顺序生成该条数据在分组内的对应的序列数,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列。
在使用的时候,后面会跟着一个函数over(),over() 的作用是将表中的记录进行分组和排序,因为row_number()是按照顺序生成对应的序列,而不是按照排序生成序列,所以row_number()一般需要与order by 进行结合使用。

问题:取各组内的第一名?

select 
cookieid,
createtime,
pv,
row_number() over(partition by cookieid order by pv desc)  as rn
from cookie.cookie2

取各组内的 rn = 1即可。

3、RANK 和DENSE_RANK

rank()生成数据项在分组中的排名,排名相等会在名词中留下空位。

dense_Rank()生成数据项在分组中的排名,排名相等在名次中不会留下空位。

select
  cookieid,
  createtime,
  pv,
  rank() over (partition by cookieid order by pv desc) as rn1,
  dense_rank() over (partition by cookieid order by pv desc) as rn2,
  row_number() over (partition by cookieid order by pv desc) as rn3
from cookie.cookie2 
where cookieid='cookie1';

查询结果:
在这里插入图片描述

总结:
row_bumber 、Rank和Dense_Rank的区别
row_number:按照顺序编号,相同的值编号不同,不留空名次;
rank:按顺序编号,相同的值编号相同,留空位;
dense_Rank:按照顺序编号,相同的值编号相同,不留空名次;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值