hive 排序 分组计数后排序 几种不同函数的效果
【转至:http://blackproof.iteye.com/blog/2164260】
总结:
三个分析函数都是按照col1分组内从1开始排序
(假设4个数,第2和第3个数据相同)
row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页 比如:1、2、3,4
dense_rank() 是连续排序,两个第二名仍然跟着第三名 :比如:1,2,2,3
rank() 是跳跃拍学,两个第二名下来就是第四名: 比如:1,2,2,4
自从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
hive 排序 分组计数后排序 几种不同函数的效果的更多相关文章
- mysql特殊查询----分组后排序
使用的示例表 学生表----student 表结构 数据 查询方法 一.第一种方法 我认为这是比较传统,比较容易理解的一种方式,使用自连接,并在连接条件中作比较,之后再对查询条件分组统计,排序. se ...
- 排序(分组后排序&整排)
一.整排 要求:根据score进行排名,分数相同,名次相同,且连续 表如下图: sql语句: 方法一:select a.score, (select count(distinct b.score) f ...
- JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- Hadoop日记Day18---MapReduce排序分组
本节所用到的数据下载地址为:http://pan.baidu.com/s/1bnfELmZ MapReduce的排序分组任务与要求 我们知道排序分组是MapReduce中Mapper端的第四步,其中分 ...
- 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较
2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...
- 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)
计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...
- 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数
第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; ...
- es聚合后排序
注意: es版本至少6.1以上 语句: GET 76/sessions/_search { "size": 0, "query": { "bool&q ...
- 【mysql】关联查询_子查询_排序分组优化
1. 关联查询优化 1.1 left join 结论: ①在优化关联查询时,只有在被驱动表上建立索引才有效! ②left join 时,左侧的为驱动表,右侧为被驱动表! 1.2 inner join ...
随机推荐
- 排序算法的python实现
几个排序算法 几个排序算法 冒泡排序 选择排序 插入排序 快速排序 quick sort 冒泡排序
- sql中的in与not in,exists与not exists的区别
1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...
- CentOS、Ubuntu、Debian简析
Centos .Ubuntu.Debian 三个Linux都是非常优秀的系统,开源的系统,也分付费的商业版和免费版,下面简单比较这三种系统. Centos系统 非常多的商业公司部署在生产环境上的服务器 ...
- linux下mysql-5.6忘记root密码,重置root密码详细过程
在linux平台下使用mysql过程中忘记了root密码,对于运维和DBA来讲都是一件头疼的事情,下面来讲解下怎么进行重置mysql数据库root 密码: 1.首先停止mysql服务进程: 1 s ...
- redis集群尝试
1. 使用Docker搭建redis主从复制集群 安装参照 Docker 搭建redis 集群 启动服务 docker run --name redis-master -p 6379:6379 -d ...
- python调用c的方法
虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成.这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数. ...
- 重识linux-循环执行的例行性工作调度
重识linux-循环执行的例行性工作调度 1 用户的设置 1)/etc/cron.allow 可以使用的账号,在这个文件内 2)/etc/cron.deny 不可以的放在这个文件里面 allow的优 ...
- Android将Log写入文件
为什么要将Log写入文件 运行应用程序的时候,大多数是不会连接着IDE的: 而当应用程序崩溃时,我们需要收集复现步骤,在设备上复现,并进行Debug: 而由于Android手机的多样性,有些问题是某个 ...
- TabNavigator Container Example
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- Flex4学习笔记 checkBox RadioButton DropDownList colorPicker
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...