Hive实现分组排序、分组求取topN或者分页的实现方法 | 您所在的位置:网站首页 › sql每组取5条 › Hive实现分组排序、分组求取topN或者分页的实现方法 |
使用到的语法:ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的每条xlh记录返回一个序号。 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)实例. 语法:row_number() over (partition by 字段a order by 计算项b desc ) rank --这里rank是别名 partition by:类似hive的建表,分区的意思; order by :排序,默认是升序,加desc降序; 这里按字段a分区,对计算项b进行降序排序 实例一、 要取top10品牌,各品牌的top10渠道,各品牌的top10渠道中各渠道的top10档期1、取top10品牌 select 品牌,sum(income) as num from table_name group by 品牌 order by num desc limit 10; 2、 取top10品牌下各品牌的top10渠道 select a.* from ( select 品牌,渠道,sum(income) as num, row_number() over (partition by 品牌 order by num desc ) rank from table_name where 品牌限制条件 group by 品牌,渠道 )a where a.rank desc employee; empid int deptid int salary decimal(10,2) Time taken: 0.042 seconds, Fetched: 3 row(s) (1)需求:根据部门分组,显示每个部门的工资等级 实现的HSQL脚本: hive> SELECT *, row_number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee; OK 1 10 5500.00 1 2 10 4500.00 2 4 20 4800.00 1 3 20 1900.00 2 7 40 44500.00 1 6 40 14500.00 2 5 40 6500.00 3 9 50 7500.00 1 8 50 6500.00 2 Time taken: 25.019 seconds, Fetched: 9 row(s) (2)根据部门分组,求出每个部门的工资等级排名top 2的数据 SELECT * FROM ( SELECT *, row_number() OVER(PARTITION BY deptid ORDER BY salary DESC ) rank FROM employee ) a WHERE a.rank = 1 AND rnum |
CopyRight 2018-2019 实验室设备网 版权所有 |