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相关推荐

  1. SQL:分组排序取top N

    1 法一 在hive上查询 select a.course,a.score from( select course,score,row_number() over(partition by cours ...

  2. HQL语句使用row_number() over(partition by),分组排序取topN

    在 mysql中实现over partiton by,进行分组排序取topN https://georgedage.blog.csdn.net/article/details/103557651 使用 ...

  3. mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园

    -- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...

  4. mysql分组排序取第一条记录

    方式1:内层使用DISTINCT SELECTtype,senderName,subTitle FROM(SELECT DISTINCTTYPE AS type,SENDER_USERNAME AS ...

  5. mysql 分组排序 取前top n

    力扣mysql 题目为: Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId . +----+-------+ ...

  6. mysql中实现over partiton by,进行分组排序取topN

    创表 CREATE TABLE `t1` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`class` ...

  7. oracle和mysql分组排序取第一条数据

    场景 需求 查每个人的Orderstr 是1 的数据,并保证name不重复 oracle select *   from (SELECT a.*, row_number() over(partitio ...

  8. Oracle根据行号达到分组排序取第一条的效果,排序后取第一条

    Oracle数据无法根据单个字段进行分组,而mysql可以,如果想要达到根据单个字段进行分组可以查询他的行号获取rowNumber达到单个字段分组取第一条效果 SELECT * FROM (SELEC ...

  9. [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

    前言:         同事的业务场景是,按照cid.author分组,再按照id倒叙,取出前2条记录出来.         oracle里面可以通过row_number() OVER (PARTIT ...

  10. mysql8 分组排序取第一或者前几

    一.基础数据 基本数据: 公司id, 数量, 创建时间 3条数据中, 2个公司, 不同的数量和时间 分组找到公司最新的数量 mysql8 有别于5.6, 5.7, 5.x版本自行百度. MySQL 8 ...

最新文章

  1. 朱敏:40岁创业如何成就绝代明星?(五)
  2. 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档...
  3. 那些离开工业界,回归学术界的AI科学家们!
  4. Python 进阶_模块 amp; 包
  5. 201521123078 《Java程序设计》第6周学习总结
  6. UILabel 详解
  7. Java 面试就业指导,100 % 提高面试成功率
  8. 为什么BAT这些大企业都喜欢用LoRa技术?
  9. 我与小娜(04):时空变换,亦真亦幻
  10. MarkdownPad-显示Awesomium 已停止工作,This view has carshed!错误
  11. 基于Python/PYQT5的动物识别专家系统(人工智能实验)
  12. 解决MyEclipse中导入项目的javascript文件中文乱码
  13. html静态网页制作代码
  14. Thinkpad SL400开机屏幕亮度问题解决了
  15. 高清视频录播服务器网站,高清录播服务器——DDA RSS3000
  16. C#窗体应用显示用户sa登录失败
  17. vtkContourFilter等值面(线)
  18. “前程无忧”招聘数据预处理——(2)
  19. 学习Hibernate框架笔记-第2天
  20. 关关难过关关过——编译edm

热门文章

  1. 二十一世纪大学英语读写教程(第二册)学习笔记(原文)——5 - Holding Onto a Dream(坚持梦想)
  2. ActiveMQ高可用集群的搭建
  3. linux查看程序bss段,LINUX下目标文件的BSS段、数据段、代码段
  4. android usb 摄像头 驱动开发,自制USB摄像头硬件的驱动编写_修改UVC
  5. 极致CMS v1.7版本-一款完全开源,免授权商用,功能强大的PHP建站系统
  6. w7计算机文件夹打开怎么设置密码,怎样设置文件夹密码 Win7系统文件夹加密步骤详解...
  7. linux中qt浏览器崩溃解决,解决Firefox火狐浏览器总是崩溃问题
  8. [UOJ#132][BZOJ4200][luogu_P2304][NOI2015]小园丁与老司机
  9. OSPF综合实验(三)
  10. 【黑灰产犯罪研究】网络水军