文章目录

  • 简单排名
  • 分组排名
  • 练习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相关推荐

  1. MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用

    转载 窗口函数简介 MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数. 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据 ...

  2. mysql8 rank_MySQL8.0窗口函数之排名函数(rank、dense_rank)的使用

    窗口函数简介MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数. 开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据返回一条 ...

  3. row number函数_Hive排名函数ROW_NUMBER,RANK 和 DENSE_RANK的区别

    需求描述:分析最近三个月每天排名前30的邮箱收件数量. 涉及到的表字段:发件时间,收件人. 一.ROW_NUMBER 表t查询出了3月每天不同类型邮箱收件量的降序排名,表t1通过ROW_NUMBER函 ...

  4. Oracle 数据库数据排名函数:rank() 和dense_rank() 。

    Oracle 数据库数据排名函数:  rank() 和dense_rank() . --------------------------------------------间断排名(也称强制排名)   ...

  5. SQL新函数, 排名函数 - ROW_NUMBER(), RANK(), DENSE_RANK()

    ROW_NUMBER() 根据over后的order by字据的字段排序,返回一个不断递增的整数. use  Northwind go select  CompanyName, ContactName ...

  6. SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较

    排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数row_number.rank.dense_rank和ntile,需要的朋友可以参考下. 排名函数是 ...

  7. hive:函数:排名函数:Rank(笔记)

    Rank 1.函数说明 RANK() 排序(排名)相同时会重复,总数不会变DENSE_RANK() 排序(排名)相同时会重复,总数会减少ROW_NUMBER() 依次进行排名 2.数据准备 表6-7  ...

  8. 【SQL】排名函数ROW_NUMBER、RANK、DENSE_RANK和NTILE讲解

    SQL中四大排名为:ROW_NUMBER.RANK.DENSE_RANK和NTILE. 其中用法为: SELECT ROW_NUMBER()|RANK()|DENSE_RANK()|NTILE(n) ...

  9. 排名函数row_number()、 rank()、 dense_rank()、ntile()、partition by的区别及具体用法示例

    1.为省时间,给同学们先看结论: row_number()排序相同时不会重复,会根据顺序排序:排名举例:1.2.3.4: rank()排序相同时会重复,总数不变:排名举例:1.2.2.4: dense ...

最新文章

  1. 只要7天 传统便利店就能免费升级无人超市
  2. Python时间序列模型推理预测实战:时序推理数据预处理(特征生成、lstm输入结构组织)、模型加载、模型预测结果保存、条件判断模型循环运行
  3. Verilog中关于case语句的优先级
  4. 虚拟化VMware之存储与虚拟机主机管理(1)
  5. Postgres使用Copy命令将表导出成csv文件的遇到Permission Denied等错误
  6. CSS3弹性伸缩布局(一)——box布局
  7. python中__init__文件的运用_python中__init__.py文件的作用
  8. 信安教程第二版-第11章网络物理隔离技术原理与应用
  9. 数据结构--hashtable(散列表)
  10. qt与JAVA服务器通信_Qt实现的SSL通信客户端和服务器
  11. Android中Webview自适应屏幕
  12. HP服务器集成 iLO 端口的配置
  13. 允许外部访问Windows本机的指定端口
  14. paip.得到程序运行实际命令
  15. Eclipse 格式化代码且不影响注释
  16. 求两个数的最小公倍数
  17. 负数求余简单技巧(C语言)
  18. Activity流程引擎表结构
  19. 凸优化之共轭函数(3)
  20. 成为域名代理商好不好?域名代理商赚钱吗?

热门文章

  1. 微积分基本公式(牛顿——莱布尼茨公式)的几何解释
  2. 商场三十六计——第2计 “围魏救赵”
  3. 【洛谷】P1145-约瑟夫
  4. 实现vivo X9s手机的宣传页面
  5. 拥有Adobe国际认证,让你在ChatGPT肆虐的设计岗位下,依然坚挺
  6. HTML5初步标签学习1——H标签,P标签,Hr标签,img标签,br标签,a标签,base标签
  7. LDPC编码译码方法研究及误码率实现
  8. 62 过去完成时+过去完成进行时
  9. 前端CSS经典面试题总结
  10. android过渡动画旋转,炫酷的Android过渡动画