hive分组排序 取top N
pig可以轻松获取TOP n。书上有例子hive中比较麻烦,没有直接实现的函数,可以写udf实现。还有个比较简单的实现方法:
用row_number,生成排名序列号。然后外部分组后按这个序列号多虑,样例代码如下
select a.*
from( select 品牌,渠道,档期,count/sum/其它() as num row_number() over (partition by 品牌,渠道 order by num desc ) rankfrom table_namewhere 品牌,渠道 限制条件group by 品牌,渠道,档期)a
where a.rank<=10
其实 排序有三个函数
(1)row_number:排序后,顺序下来,相同项按先后顺序排序,1,2,3,4,5
(2)rank:排序后,遇到数据相同项时序号一致,后面并留空一位,比如,1,2,2,4,4,6
dense_rank:在遇到数据相同项时,序号一致,不留空位,如 1,2,2,3,3,4,4,5
具体用例可以参见:http://www.cnblogs.com/dycg/p/4260283.html
我自己设计的代码
##统计国内,各省份的城市排名
select b.*
from
(select country,province,city,cnt,row_number() over (partition by country,province order by cnt desc) rank
from (select country,province,city,count(1) as cntfrom tb_pmp_region_report_hive_mappingwhere country = '中国'group by country,province,city) a
)b
where b.rank<=3
表a统计出基本数据,从a中加排名项。然后,按排名项过滤。内部group后,外部不需要group by
需要注意的是,加排名项时,不应该使用group。
如果有group,那么row_number中的order by项必须是group内的字段,否则报错,如下段代码报错
select b.*
from
(select country,province,city,cnt,row_number() over (partition by country,province order by cnt desc) rank
from (select country,province,city,count(1) as cntfrom tb_pmp_region_report_hive_mappingwhere country = '中国'group by country,province,city) agroup by country,province,city
)b
where b.rank<=3
执行报错:
FAILED: SemanticException Failed to breakup Windowing invocations into Groups. At least 1 group must only depend on input columns. Also check for circular dependencies.
Underlying error: org.apache.hadoop.hive.ql.parse.SemanticException: Line 7:62 Expression not in GROUP BY key ‘cnt’
hive>
hive分组排序 取top N相关推荐
- SQL:分组排序取top N
1 法一 在hive上查询 select a.course,a.score from( select course,score,row_number() over(partition by cours ...
- HQL语句使用row_number() over(partition by),分组排序取topN
在 mysql中实现over partiton by,进行分组排序取topN https://georgedage.blog.csdn.net/article/details/103557651 使用 ...
- mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园
-- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...
- mysql分组排序取第一条记录
方式1:内层使用DISTINCT SELECTtype,senderName,subTitle FROM(SELECT DISTINCTTYPE AS type,SENDER_USERNAME AS ...
- mysql 分组排序 取前top n
力扣mysql 题目为: Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId . +----+-------+ ...
- mysql中实现over partiton by,进行分组排序取topN
创表 CREATE TABLE `t1` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`class` ...
- oracle和mysql分组排序取第一条数据
场景 需求 查每个人的Orderstr 是1 的数据,并保证name不重复 oracle select * from (SELECT a.*, row_number() over(partitio ...
- Oracle根据行号达到分组排序取第一条的效果,排序后取第一条
Oracle数据无法根据单个字段进行分组,而mysql可以,如果想要达到根据单个字段进行分组可以查询他的行号获取rowNumber达到单个字段分组取第一条效果 SELECT * FROM (SELEC ...
- [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit
前言: 同事的业务场景是,按照cid.author分组,再按照id倒叙,取出前2条记录出来. oracle里面可以通过row_number() OVER (PARTIT ...
- mysql8 分组排序取第一或者前几
一.基础数据 基本数据: 公司id, 数量, 创建时间 3条数据中, 2个公司, 不同的数量和时间 分组找到公司最新的数量 mysql8 有别于5.6, 5.7, 5.x版本自行百度. MySQL 8 ...
最新文章
- 朱敏:40岁创业如何成就绝代明星?(五)
- 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档...
- 那些离开工业界,回归学术界的AI科学家们!
- Python 进阶_模块 amp; 包
- 201521123078 《Java程序设计》第6周学习总结
- UILabel 详解
- Java 面试就业指导,100 % 提高面试成功率
- 为什么BAT这些大企业都喜欢用LoRa技术?
- 我与小娜(04):时空变换,亦真亦幻
- MarkdownPad-显示Awesomium 已停止工作,This view has carshed!错误
- 基于Python/PYQT5的动物识别专家系统(人工智能实验)
- 解决MyEclipse中导入项目的javascript文件中文乱码
- html静态网页制作代码
- Thinkpad SL400开机屏幕亮度问题解决了
- 高清视频录播服务器网站,高清录播服务器——DDA RSS3000
- C#窗体应用显示用户sa登录失败
- vtkContourFilter等值面(线)
- “前程无忧”招聘数据预处理——(2)
- 学习Hibernate框架笔记-第2天
- 关关难过关关过——编译edm
热门文章
- 二十一世纪大学英语读写教程(第二册)学习笔记(原文)——5 - Holding Onto a Dream(坚持梦想)
- ActiveMQ高可用集群的搭建
- linux查看程序bss段,LINUX下目标文件的BSS段、数据段、代码段
- android usb 摄像头 驱动开发,自制USB摄像头硬件的驱动编写_修改UVC
- 极致CMS v1.7版本-一款完全开源,免授权商用,功能强大的PHP建站系统
- w7计算机文件夹打开怎么设置密码,怎样设置文件夹密码 Win7系统文件夹加密步骤详解...
- linux中qt浏览器崩溃解决,解决Firefox火狐浏览器总是崩溃问题
- [UOJ#132][BZOJ4200][luogu_P2304][NOI2015]小园丁与老司机
- OSPF综合实验(三)
- 【黑灰产犯罪研究】网络水军