1、ROW_NUMBER,RANK(),DENSE_RANK()

语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rank

partition by:类似hive的建表,分区的意思;

order by :排序,默认是升序,加desc降序;

rank:表示别名

表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

1.1 案例

1.1.1 样本数据

浙江,杭州,300

浙江,宁波,150

浙江,温州,200

浙江,嘉兴,100

江苏,南京,270

江苏,苏州,299

江苏,某市,200

江苏,某某市,100

1.1.2导入数据

--执行下述语句

hive (temp)> hive -f 'HQL/loaddata.hql'>out/tmp;

-----------------------------------------------

drop table datatable;

CREATE table datatable (

province string,

city string,

people int)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

STORED AS TEXTFILE;

load data local inpath 'home/loaddata'

overwrite into table temp.datatable;

----------------------------------------------

--查看结果

hive (temp)> select * from datatable;

OK

province city people

浙江 杭州 300

浙江 宁波 150

浙江 温州 200

浙江 嘉兴 100

江苏 南京 270

江苏 苏州 299

江苏 某市 200

江苏 某某市 100

1.2 按照人口降序排列,生成衍生变量

select province,city,

rank() over (order by people desc) rank,

dense_rank() over (order by people desc) dense_rank,

row_number() over(order by people desc) row_number

from datatable

group by province,city,people;

--结果

province city rank dense_rank row_number

浙江 杭州 1 1 1

江苏 苏州 2 2 2

江苏 南京 3 3 3

浙江 温州 4 4 4

江苏 某市 4 4 5

浙江 宁波 6 5 6

江苏 某某市 7 6 7

浙江 嘉兴 7 6 8

主要注意打圈的:

row_number:顺序下来

rank:在遇到数据相同项时,会留下空位5,(第一列4,4,6)

dense_rank:在遇到数据相同项时,不会留下空位,(红框内第一列,4,4,5)

1.3 分组按照省份分区,再按照人口降序排列,生成衍生变量

select province,city,

rank() over (partition by province order by people desc) rank,

dense_rank() over (partition by province order by people desc) dense_rank,

row_number() over(partition by province order by people desc) row_number

from datatable

group by province,city,people;

--结果

province city rank dense_rank row_number

江苏 苏州 1 1 1

江苏 南京 2 2 2

江苏 某市 3 3 3

江苏 某某市 4 4 4

浙江 杭州 1 1 1

浙江 温州 2 2 2

浙江 宁波 3 3 3

浙江 嘉兴 4 4 4

2取TOPN数据

2.1 按照国家提取TOP3

2.1.1 样本数据:

国家 城市 Visitors

阿联酋,阿布扎比,137

阿联酋,阿布扎比,146

阿联酋,阿布扎比,178

阿联酋,阿布扎比,337

阿联酋,阿布扎比,178

阿联酋,阿布扎比,227

阿联酋,阿布扎比,157

阿联酋,迪拜,144

阿联酋,迪拜,268

阿联酋,迪拜,103

阿联酋,迪拜,141

阿联酋,迪拜,108

阿联酋,迪拜,266

澳大利亚,悉尼,141

澳大利亚,悉尼,122

澳大利亚,悉尼,153

澳大利亚,悉尼,128

澳大利亚,墨尔本,294

澳大利亚,墨尔本,230

澳大利亚,墨尔本,159

澳大利亚,墨尔本,188

澳大利亚,堪培拉,249

澳大利亚,堪培拉,378

澳大利亚,堪培拉,255

澳大利亚,堪培拉,240

2.1.2导入数据

--执行下述语句

hive (temp)> hive -f 'HQL/loaddata.hql'>out/tmp;

-----------------------------------------------

drop table temp.tripdata;

CREATE table datatable (

country string,

city string,

Visitors int)

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

STORED AS TEXTFILE;

load data local inpath 'home/loaddata'

overwrite into table temp.tripdata;

----------------------------------------------

----------------------------------------------

--查看结果

hive (temp)> select * from tripdata;

country city visitors

阿联酋 阿布扎比 137

阿联酋 阿布扎比 146

阿联酋 阿布扎比 178

阿联酋 阿布扎比 337

阿联酋 阿布扎比 178

阿联酋 阿布扎比 227

阿联酋 阿布扎比 157

阿联酋 迪拜 144

阿联酋 迪拜 268

阿联酋 迪拜 103

阿联酋 迪拜 141

阿联酋 迪拜 108

阿联酋 迪拜 266

澳大利亚 悉尼 141

澳大利亚 悉尼 122

澳大利亚 悉尼 153

澳大利亚 悉尼 128

澳大利亚 墨尔本 294

澳大利亚 墨尔本 230

澳大利亚 墨尔本 159

澳大利亚 墨尔本 188

澳大利亚 堪培拉 249

澳大利亚 堪培拉 378

澳大利亚 堪培拉 255

澳大利亚 堪培拉 240

---格式:select 品牌,count/sum/其它() as num from table_name order by num limit 10;

select country,city,visitors

from tripdata

order by visitors desc

limit 5;

country city visitors

澳大利亚 堪培拉 378

阿联酋 阿布扎比 337

澳大利亚 墨尔本 294

阿联酋 迪拜 268

阿联酋 迪拜 266

2.2 按照国家、城市提取TOP3

--取top10品牌下各品牌的top10渠道 ,格式:

select

a.*

from

(

select 品牌,渠道,count/sum/其它() as num row_number() over (partition by 品牌 order by num desc ) rank

from table_name

where 品牌限制条件

group by 品牌,渠道

)a

where a.rank<=10

select a.*

from (

select country,city,visitors, row_number() over (partition by country order by visitors desc ) rank

from tripdata

order by country,visitors desc

) a

where a.rank<=3;

--结果

a.country a.city a.visitors a.rank

澳大利亚 堪培拉 378 1

澳大利亚 墨尔本 294 2

澳大利亚 堪培拉 255 3

阿联酋 阿布扎比 337 1

阿联酋 迪拜 268 2

阿联酋 迪拜 266 3

2.3 按照国家提取TOP5

--取top10品牌下各品牌的top10渠道中各渠道的top10档期 ,格式:

select a.*

from

(

select 品牌,渠道,档期,count/sum/其它() as num row_number() over (partition by 品牌,渠道 order by num desc ) rank

from table_name

where 品牌,渠道 限制条件

group by 品牌,渠道,档期

)a

where a.rank<=10

select a.*

from (

select country,city,visitors, row_number() over (partition by city order by visitors desc ) rank

from tripdata

order by country,city,visitors desc

) a

where a.rank<=3;

--结果

a.country a.city a.visitors a.rank

澳大利亚 堪培拉 378 1

澳大利亚 堪培拉 255 2

澳大利亚 堪培拉 249 3

澳大利亚 墨尔本 294 1

澳大利亚 墨尔本 230 2

澳大利亚 墨尔本 188 3

澳大利亚 悉尼 153 1

澳大利亚 悉尼 141 2

澳大利亚 悉尼 128 3

阿联酋 迪拜 268 1

阿联酋 迪拜 266 2

阿联酋 迪拜 144 3

阿联酋 阿布扎比 337 1

阿联酋 阿布扎比 227 2

阿联酋 阿布扎比 178 3

hive udf 分组取top1_Hive分组取Top K数据相关推荐

  1. hive udf 分组取top1_Hive中分组取前N个值的实现-row_number()

    背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...

  2. hive udf 分组取top1_Hive的经典面试题

    很久没有发文章了,今天发表一下Hive的总结,如果那里有不足的欢迎指正,顺便再提一个问题(数仓建模中:细化程度越高,粒度级就越小,相反,细化程度越低,粒度级就越大,这个说法能打个比方比喻出来吗?) 必 ...

  3. Pig、Hive、MapReduce 解决分组 Top K 问题

    2019独角兽企业重金招聘Python工程师标准>>> 问题: 有如下数据文件 city.txt (id, city, value) cat city.txt  1 wh 500 2 ...

  4. 05. 取SQL分组中的某几行数据

    05. 取SQL分组中的某几行数据 原文:05. 取SQL分组中的某几行数据 对表中数据分组,有时只需要某列的聚合值:有时却需要返回整行数据,常用的方法有:子查询.ROW_NUMBER.APPLY,总 ...

  5. mysql分组取出每组地一条数据_基于mysql实现group by取各分组最新一条数据

    基于mysql实现group by取各分组最新一条数据 前言: group by函数后取到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢? 本文提供两种实现方式. 一.准 ...

  6. mysql分组取日期最大的记录_mysql 分组 group by, 排序 取每条记录中,时间最大

    mysql教程 分组 group by, 排序 取每条记录中,时间最大的一条记录 select a.* from test a, (select aid, max(day) max_day from ...

  7. Oracle分组后对分组内容重复 取第一个

    Oracle分组后对分组内容重复 的以另一列排序后 取第一个 语句 select * from( select a.grep, row_number() over (partition by a.gr ...

  8. hive UDF函数取最新分区

    hive UDF函数取最新分区 1.pom文件 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.hi ...

  9. mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)

    mysql group by 之后取每个分组最新的一条(或者按照自定义的规则排序)_toString的博客-CSDN博客 select * from  mt_customer_bind_info_ax ...

最新文章

  1. CCF推荐系统项目代码解读!
  2. 公司用--页面表单提交用的key是拼接的,保存时action的写法,struts1
  3. java script 月日年转年月日_js的如何进行日期格式转换成年月日
  4. c++ 浮点比较和浮点运算
  5. linux存储--共享内存机制mmap(十二)
  6. mysqldump命令
  7. 批量生成6位数字_分享一款可做各种流水号的条码生成软件
  8. js中 javascript:void(0) 用法详解
  9. android 自定义 radiobutton 文字颜色随选中状态而改变
  10. 杠杠做的全屏随鼠标滚动显示图片,类似于PPT效果
  11. 学C语言开发能实现月薪12K吗?
  12. Java程序中调用Python脚本的方法
  13. 贵州大学计算机科学与技术学院排名,贵州大学的计算机专业全国排名第几?
  14. Android入门基础教程1
  15. java编程思想之并发(线程之间的协作)
  16. 走迷宫小游戏课设(C语言)
  17. JS JQuery实现简单的鼠标移动动画效果
  18. mysql数据库表空间压缩,表空间中有数据也可以压缩表空间(数据文件)大小!!...
  19. 攻击与脆弱性之间的关系
  20. 用dos命令行执行java程序的方法

热门文章

  1. bash shell 变量的配置守则
  2. 1.10a – 如何设计你的第一个程序
  3. SpringBoot日记——ElasticSearch全文检索
  4. 开发文档之 概要设计说明书 详细设计说明书 数据库设计说明书
  5. 客户端网页编程,第二章思维导图
  6. android 继承ListView实现滑动删除功能.
  7. [调试技巧] 如何利用WinDbg找出程序崩溃的位置
  8. android 添加安装权限白名单
  9. 高通android开发摘要
  10. WinCE中断结构分析