hive窗口函数之排名函数row_number、rank和dense_rank
文章目录
- 简单排名
- 分组排名
- 练习1-取前两名学生
- 练习2-连续签到次数
排名函数主要有row_number、rank和dense_rank。
简单排名
row_number是行号,不会重复,rank数据相同的,给出并列排名,但是会跳跃,dense_rank类似于rank,但不会跳跃,通过下面的案例来看一下区别。
准备数据
drop table if exists test.test_zw;
CREATE TABLE if not exists test.test_zw(name string COMMENT '姓名',score double comment '成绩')
COMMENT '测试表'
STORED as parquet TBLPROPERTIES('parquet.compression'='SNAPPY');-- 插入数据
insert into test.test_zw values
('小王',100),
('小李',90),
('小张',90),
('小红',80);
简单查询
select name,score
from test.test_zw
order by score desc
按照成绩降序排名
select name,score
,row_number() over( order by score desc) `row_number排名`
,rank() over ( order by score desc) `rank排名`
,dense_rank() over ( order by score desc) `dense_rank排名`
from test.test_zw
order by score desc
分组排名
over里面使用partition by可以指定分组,给出分组排名。例如查看数学和语文的排名。
准备数据
drop table if exists test.test_zw;
CREATE TABLE if not exists test.test_zw(name string COMMENT '姓名',course string comment '课程',score double comment '成绩')
COMMENT '测试表'
STORED as parquet TBLPROPERTIES('parquet.compression'='SNAPPY');-- 插入数据
insert into test.test_zw values
('小王','数学',100),
('小李','数学',90),
('小张','数学',90),
('小红','数学',80),
('小王','语文',60),
('小李','语文',80),
('小张','语文',80),
('小红','语文',100);
简单查询
select name,course,score
from test.test_zw
order by course,score desc
先按course分组,再按score降序排名
select name,course,score
,row_number() over( partition by course order by score desc) `row_number排名`
,rank() over ( partition by course order by score desc) `rank排名`
,dense_rank() over ( partition by course order by score desc) `dense_rank排名`
from test.test_zw
order by course, score desc
练习1-取前两名学生
需求:分别获取数学和语文前两名的学生
分析:先使用rank函数按照course分组score降序排名,然后取排名小于等于2的数据。注意,使用rank可以跑出并列排名,最终可能导致跑出的数据多于要求的数据。
select name,course,score,`rank排名`
from (select name,course,score,row_number() over( partition by course order by score desc) `row_number排名`,rank() over ( partition by course order by score desc) `rank排名`,dense_rank() over ( partition by course order by score desc) `dense_rank排名`from test.test_zw
) t1
where `rank排名`<=2
order by course, score desc
练习2-连续签到次数
需求:有如下数据,取出每个用户最高连续签到次数。
准备数据:
drop table if exists test.test_zw;
CREATE TABLE if not exists test.test_zw(name string COMMENT '姓名',sign_date string comment '签到日期')
COMMENT '测试表'
STORED as parquet TBLPROPERTIES('parquet.compression'='SNAPPY');-- 插入数据
insert into test.test_zw values
('老王','2021-01-01'),
('老王','2021-01-02'),
('老王','2021-01-03'),
('老王','2021-01-07'),
('小张','2021-01-01'),
('小张','2021-01-03'),
('小张','2021-01-04');
简单查询:从数据上看,老王最高连续签到3次,小张最高连续签到2次。
select name,sign_date
from test.test_zw
order by name,sign_date
第一步:给每一组连续签到打标,方法是签到日期减去排名,如果是连续签到,返回的日期相同。比如老王1号、2号、3号连续签到,返回2020-12-31。
select name
,sign_date
,rank() over(partition by name order by sign_date asc) as `排名`
,date_sub(sign_date, rank() over(partition by name order by sign_date asc))as label -- 连续签到分组标签
from test.test_zw
order by name,sign_date
第二步:按照姓名和连续签到分组标签分组,签到日期升序排名。
select name,sign_date,label
,rank() over(partition by name,label order by sign_date asc) as `连续签到排名`
from (select name,sign_date,rank() over(partition by name order by sign_date asc) as `排名`,date_sub(sign_date, rank() over(partition by name order by sign_date asc))as label -- 连续签到分组标签from test.test_zw
) t1
order by name,sign_date
最后一步:取出每个用户连续签到排名的最大值,至此大功告成。
select name,max(`连续签到排名`) as `最大连续签到次数`
from (select name,sign_date,label,rank() over(partition by name,label order by sign_date asc) as `连续签到排名`from (select name,sign_date,rank() over(partition by name order by sign_date asc) as `排名`,date_sub(sign_date, rank() over(partition by name order by sign_date asc))as label -- 连续签到分组标签from test.test_zw) t1
) t2
group by name
hive窗口函数之排名函数row_number、rank和dense_rank相关推荐
- MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用
转载 窗口函数简介 MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数. 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据 ...
- mysql8 rank_MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用
窗口函数简介MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数. 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据返回一条 ...
- row number函数_Hive排名函数ROW_NUMBER,RANK 和 DENSE_RANK的区别
需求描述:分析最近三个月每天排名前30的邮箱收件数量. 涉及到的表字段:发件时间,收件人. 一.ROW_NUMBER 表t查询出了3月每天不同类型邮箱收件量的降序排名,表t1通过ROW_NUMBER函 ...
- Oracle 数据库数据排名函数:rank() 和dense_rank() 。
Oracle 数据库数据排名函数: rank() 和dense_rank() . --------------------------------------------间断排名(也称强制排名) ...
- SQL新函数, 排名函数 - ROW_NUMBER(), RANK(), DENSE_RANK()
ROW_NUMBER() 根据over后的order by字据的字段排序,返回一个不断递增的整数. use Northwind go select CompanyName, ContactName ...
- SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较
排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数row_number.rank.dense_rank和ntile,需要的朋友可以参考下. 排名函数是 ...
- hive:函数:排名函数:Rank(笔记)
Rank 1.函数说明 RANK() 排序(排名)相同时会重复,总数不会变DENSE_RANK() 排序(排名)相同时会重复,总数会减少ROW_NUMBER() 依次进行排名 2.数据准备 表6-7 ...
- 【SQL】排名函数ROW_NUMBER、RANK、DENSE_RANK和NTILE讲解
SQL中四大排名为:ROW_NUMBER.RANK.DENSE_RANK和NTILE. 其中用法为: SELECT ROW_NUMBER()|RANK()|DENSE_RANK()|NTILE(n) ...
- 排名函数row_number()、 rank()、 dense_rank()、ntile()、partition by的区别及具体用法示例
1.为省时间,给同学们先看结论: row_number()排序相同时不会重复,会根据顺序排序:排名举例:1.2.3.4: rank()排序相同时会重复,总数不变:排名举例:1.2.2.4: dense ...
最新文章
- 只要7天 传统便利店就能免费升级无人超市
- Python时间序列模型推理预测实战:时序推理数据预处理(特征生成、lstm输入结构组织)、模型加载、模型预测结果保存、条件判断模型循环运行
- Verilog中关于case语句的优先级
- 虚拟化VMware之存储与虚拟机主机管理(1)
- Postgres使用Copy命令将表导出成csv文件的遇到Permission Denied等错误
- CSS3弹性伸缩布局(一)——box布局
- python中__init__文件的运用_python中__init__.py文件的作用
- 信安教程第二版-第11章网络物理隔离技术原理与应用
- 数据结构--hashtable(散列表)
- qt与JAVA服务器通信_Qt实现的SSL通信客户端和服务器
- Android中Webview自适应屏幕
- HP服务器集成 iLO 端口的配置
- 允许外部访问Windows本机的指定端口
- paip.得到程序运行实际命令
- Eclipse 格式化代码且不影响注释
- 求两个数的最小公倍数
- 负数求余简单技巧(C语言)
- Activity流程引擎表结构
- 凸优化之共轭函数(3)
- 成为域名代理商好不好?域名代理商赚钱吗?