Hive分组取Top N

Hive在0.11.0版本开始加入了row_number、rank、dense_rank分析函数,可以查询分组排序后的top值

说明:

row_number() over ([partition col1] [order by col2])

rank() over ([partition col1] [order by col2])

dense_rank() over ([partition col1] [order by col2])

它们都是根据col1字段分组,然后对col2字段进行排序,对排序后的每行生成一个行号,这个行号从1开始递增

col1、col2都可以是多个字段,用‘,‘分隔

区别:

1)row_number:不管col2字段的值是否相等,行号一直递增,比如:有两条记录的值相等,但一个是第一,一个是第二

2)rank:上下两条记录的col2相等时,记录的行号是一样的,但下一个col2值的行号递增N(N是重复的次数),比如:有两条并列第一,下一个是第三,没有第二

3)dense_rank:上下两条记录的col2相等时,下一个col2值的行号递增1,比如:有两条并列第一,下一个是第二

row_number可以实现分页查询

实例:

  1. hive> create table t(name string, sub string, score int) row format delimited fields terminated by ‘\t‘;

数据在附件的a.txt里

  1. a chinese 98
  2. a english 90
  3. d chinese 88
  4. c english 82
  5. c math 98
  6. b math 89
  7. b chinese 79
  8. z english 90
  9. z math 89
  10. z chinese 80
  11. e math 99
  12. e english 87
  13. d english 90

1、row_number

  1. hive (test)> select *, row_number() over (partition by sub order by score) as od from t; 

2、rank

  1. hive (test)> select *, rank() over (partition by sub order by score) as od from t; 

3、dense_ran

  1. hive (test)> select *, dense_rank() over (partition by sub order by score desc) from t;

业务实例:

统计每个学科的前三名

  1. select * from (select *, row_number() over (partition by sub order by score desc) as od from t ) t where od<=3;

语文成绩是80分的排名是多少

  1. hive (test)> select od from (select *, row_number() over (partition by sub order by score desc) as od from t ) t where sub=‘chinese‘ and score=80;

分页查询

  1. hive (test)> select * from (select *, row_number() over () as rn from t) t1 where rn between 1 and 5;

来自为知笔记(Wiz)

附件列表

时间: 2024-10-18 04:54:27

Hive分组取Top N的相关文章

sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据

SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单.下面是一个简单示例: --1.创建测试

sqlserver分组取top

select s.* from ( select *, row_number() over (partition by [分组字段] order by [排序字段]) as 别名 from 表名称 ) s where s.别名 = 1 .. 原文地址:https://www.cnblogs.com/salv/p/11832130.html

Hive中分组取前N个值

分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科,成绩做order by排序,然后对排序后的成绩,执行自定义函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1, ....),它的作用是按指定的列进行分组生成行序列.在ROW_NUMBER(a,b) 时,若两条记录的a,b列相同

SQL Server 分组后取Top N

SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿.冥思苦想,遍查网络,不曾想这竟然是SQL界的一个经典话题.今日将我得来的若干方法列出,抛砖引玉,以期与众位探讨. 正文之前,对示例表结构加以说明. 表SectionTransactionLog,用来记录各部门各项活动的日志表 SectionId,部门Id SectionTransactionTyp

hive分组排序函数 分组取top10

hive分组排序函数 分组取top10 语法:row_number() over( partition by 字段a order by 计算项b desc) rank --这里rank是别名 Partition by:类似hive的建表,分区的意思 这里按字段a分区,对计算项b进行降序排序 实例: 要取top10品牌,各品牌的top10渠道,各品牌的top10渠道中各渠道的top10档期 1) 取top10品牌 Select 品牌,count/sum/其他() as num from tb_na

oracle中分组排序取TOP n

数据库中数据处理时,经常需要对某一类的数据取Top n,这就涉及到分组group by 并排序 order by ,之后根据rownum获取前几名数据,oracle数据库中ROW_NUMBER() OVER函数可以实现这个功能,如下: /*获取tab_a表中每个省份counts最大的前10个kpi*/SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY prov ORDER BY counts DESC) rn, prov, kpi, coun

SQL按字段分组取最大(小)值记录(重复记录)

SQL Server 按某一字段分组 取 最大 (小)值所在行的数据 -- 按某一字段分组 取 最大 (小)值所在行的数据 -- (爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23于浙江杭州) /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1--b的第一个值 b    3   b3:b的第三个值 b    2   b2b2b2b2 b   

按某一字段分组取最大(小)值所在行的数据 分拆列值(转) 日期的推算

数据如下:name val memoa 2 a2(a的第二个值)a 1 a1--a的第一个值a 3 a3:a的第三个值b 1 b1--b的第一个值b 3 b3:b的第三个值b 2 b2b2b2b2b 4 b4b4b 5 b5b5b5b5b5*/--创建表并插入数据:create table tb(name varchar(10),val int,memo varchar(20))insert into tb values('a', 2, 'a2(a的第二个值)')insert into tb v

SQL分组取每组前一(或几)条记录(排名)

mysql分组取每组前几条记录(排名) 附group by与order by的研究 http://www.jb51.net/article/31590.htm --按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: name val memo a 2 a2(a的第二个值) a 1 a1--a的第一个值 a 3 a3:a的第三个值 b 1 b1--b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b 5 b5b5b5b5b5 */ --创建表