首页 > 其他分享 >hive row_number分组排序top

hive row_number分组排序top

时间:2023-04-20 17:44:24浏览次数:35  
标签:语文 name top number hive score 数学 80 select


自从hive 0.11.0 开始,加入了类似orcle的分析函数,很强大,可以查询到分组排序top值

使用方法跟oracle没有差别

 

贴个小例子

查询的是同一个操作下pv前十的用户

select
*
,row_number() OVER(PARTITION BY t3.action ORDER BY pv desc) AS flag
from
(
select 
action
,uuid
,count(1) as pv
from logtable t
group by t.action,uuid
)  t1
where t1.flag<=10

 

 

 

 

 

贴一个oracle rank的帖子

rank,dense_rank,row_number区别

一:语法(用法):
     rank() over([partition by col1] order by col2) 
     dense_rank() over([partition by col1] order by col2) 
     row_number() over([partition by col1] order by col2) 
     其中[partition by col1]可省略。

二:区别
    三个分析函数都是按照col1分组内从1开始排序
    
    row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页
    dense_rank() 是连续排序,两个第二名仍然跟着第三名
    rank()       是跳跃拍学,两个第二名下来就是第四名
    
    理论就不多讲了,看了案例,一下就明白了
    
SQL> create table t(
  2   name varchar2(10),
  3   score number(3));
 
Table created
 
SQL> insert into t(name,score) 
  2   select '语文',60 from dual union all
  3   select '语文',90 from dual union all
  4   select '语文',80 from dual union all
  5   select '语文',80 from dual union all
  6   select '数学',67 from dual union all
  7   select '数学',77 from dual union all
  8   select '数学',78 from dual union all
  9   select '数学',88 from dual union all
 10   select '数学',99 from dual union all
 11   select '语文',70 from dual
 12  /
 
10 rows inserted
 
SQL> select * from t;
 
NAME       SCORE
---------- -----
语文          60
语文          90
语文          80
语文          80
数学          67
数学          77
数学          78
数学          88
数学          99
语文          70
 
10 rows selected
 
SQL> select name,score,rank() over(partition by name order by score) tt from t;
 
NAME       SCORE         TT
---------- ----- ----------
数学          67          1
数学          77          2
数学          78          3
数学          88          4
数学          99          5
语文          60          1
语文          70          2
语文          80          3   <----
语文          80          3   <----
语文          90          5
 
10 rows selected
 
SQL> select name,score,dense_rank() over(partition by name order by score) tt from t;
 
NAME       SCORE         TT
---------- ----- ----------
数学          67          1
数学          77          2
数学          78          3
数学          88          4
数学          99          5
语文          60          1
语文          70          2
语文          80          3   <----
语文          80          3   <----
语文          90          4
 
10 rows selected
 
SQL> select name,score,row_number() over(partition by name order by score) tt from t;
 
NAME       SCORE         TT
---------- ----- ----------
数学          67          1
数学          77          2
数学          78          3
数学          88          4
数学          99          5
语文          60          1
语文          70          2
语文          80          3  <----
语文          80          4  <----
语文          90          5
 
10 rows selected
 
SQL> select name,score,rank() over(order by score) tt from t;
 
NAME       SCORE         TT
---------- ----- ----------
语文          60          1
数学          67          2
语文          70          3
数学          77          4
数学          78          5
语文          80          6
语文          80          6
数学          88          8
语文          90          9
数学          99         10
 
10 rows selected
 

大家应该明白了吧!呵呵!接下来看应用

一:dense_rank------------------查询每门功课前三名

  select name,score from (select name,score,dense_rank() over(partition by name order by score desc) tt from t) x where x.tt<=3
  
 
NAME       SCORE
---------- -----
数学          99
数学          88
数学          78
语文          90
语文          80
语文          80
 
6 rows selected

二:rank------------------语文成绩70分的同学是排名第几。
   select name,score,x.tt from (select name,score,rank() over(partition by name order by score desc) tt from t) x where x.name='语文' and x.score=70
 
 
NAME       SCORE         TT
---------- ----- ----------
语文          70          4
    
三:row_number——————分页查询
     select xx.* from (select t.*,row_number() over(order by score desc) rowno from t) xx where xx.rowno between 1 and 3;
 
NAME       SCORE      ROWNO
---------- ----- ----------
数学          99          1
语文          90          2
数学          88          3

标签:语文,name,top,number,hive,score,数学,80,select
From: https://blog.51cto.com/u_2465818/6210002

相关文章

  • hive函数
    用pig的时候,超不爱用pig带的函数,一般都自己写但是用hive,就越来越懒,变成了能不写就不写自己的udf,哈哈 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 1.内置运算符 1.1关系运算符  运算符类型说明A=B所有原始类型如果A与B相等......
  • redis desktop manager 怎么用-redis desktop manager 下载分享
    redisdesktopmanager怎么用呢?小编为大家的带来了redisdesktopmanager下载安装包。RedisDesktopManager是一款开源的Redis数据库管理工具,由RedisDesktop开发。redisdesktopmanager下载 以下是RedisDesktopManager的一些主要特点:1.直观的用户界面:RedisDesktop......
  • hive local mr转
    在hive中运行的sql有很多是比较小的sql,数据量小,计算量小.这些比较小的sql如果也采用分布式的方式来执行,那么是得不偿失的.因为sql真正执行的时间可能只有10秒,但是分布式任务的生成得其他过程的执行可能要1分钟.这样的小任务更适合采用lcoalmr的方式来执行.就是在本地来执行,通......
  • LeetCode Top100: 买卖股票的最佳时机 (python)
    LeetCodeTop100: 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这......
  • 如何让 Windows 应用程序在 Parallels Desktop 中启动得更快
    经过十多年的发展,ParallelsDesktop在性能方面得到了突飞猛进的提升。但俗话说,“没有最快只有更快。”因此,在这篇文章中,小编将分享您一个小技巧:如何使您的Windows应用程序启动得更快。下图显示了视频中的同一台M1MacBookPro和在InteliMac上测试个过的启动时间。“第......
  • LeetCode Top100:回文链表 (python)
    LeetCodeTop100:回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9 ......
  • LeetCode Top100: 相交链表(Python)
    LeetCodeTop100:相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原......
  • LeetCode Top100: 环形链表(python)
     给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为......
  • 2023年windows DockerDeskTop最新款4.18.0 全程保姆级安装
    目录前景提示windows10内置的linux系统1.这个内置系统一定要在windowsstore里安装,否则,无法使用,这是重点。进入商店,搜索linux。2.一般画圈这些都可以使用。4.安装会让你输入微软账户密码(首次)。5.静静等待,本作的这个大概550M左右。6.装好后,会生成一个图标(像应用程序一样,双击......
  • UESTC Final Pan's prime numbers 1272 (坑)
    FinalPan'sprimenumbersTimeLimit:3000/1000MS(Java/Others)   MemoryLimit:65535/65535KB(Java/Others)Submit StatusFinalPanlikesprimenumbersverymuch.Oneday,hewanttofindthesuperprimenumbers.Aprimenumbers n(n>4)......