【转至: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前十的用户

  1. select
  2. *
  3. ,row_number() OVER(PARTITION BY t3.action ORDER BY pv desc) AS flag
  4. from
  5. (
  6. select
  7. action
  8. ,uuid
  9. ,count(1) as pv
  10. from logtable t
  11. group by t.action,uuid
  12. )  t1
  13. 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 排序 分组计数后排序 几种不同函数的效果的更多相关文章

  1. mysql特殊查询----分组后排序

    使用的示例表 学生表----student 表结构 数据 查询方法 一.第一种方法 我认为这是比较传统,比较容易理解的一种方式,使用自连接,并在连接条件中作比较,之后再对查询条件分组统计,排序. se ...

  2. 排序(分组后排序&整排)

    一.整排 要求:根据score进行排名,分数相同,名次相同,且连续 表如下图: sql语句: 方法一:select a.score, (select count(distinct b.score) f ...

  3. JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

  4. Hadoop日记Day18---MapReduce排序分组

    本节所用到的数据下载地址为:http://pan.baidu.com/s/1bnfELmZ MapReduce的排序分组任务与要求 我们知道排序分组是MapReduce中Mapper端的第四步,其中分 ...

  5. 归并排序 & 计数排序 & 基数排序 & 冒泡排序 & 选择排序 ----> 内部排序性能比较

    2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...

  6. 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)

    计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...

  7. 第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;  ...

  8. es聚合后排序

    注意: es版本至少6.1以上 语句: GET 76/sessions/_search { "size": 0, "query": { "bool&q ...

  9. 【mysql】关联查询_子查询_排序分组优化

    1. 关联查询优化 1.1 left join 结论: ①在优化关联查询时,只有在被驱动表上建立索引才有效! ②left join 时,左侧的为驱动表,右侧为被驱动表! 1.2 inner join ...

随机推荐

  1. Java 1.ExecutorService四种线程池的例子与说明

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  2. @ResponseBody返回中文乱码

    1.在方法上修改编码 这种方式,需要对每个方法都进行配置. 2.修改springmvc的配置文件 同时注意,把这个配置写在扫描包的上面.

  3. spring-data-redis 中使用RedisTemplate操作Redis

    Redis 数据结构简介 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合 ...

  4. 【Linux】【secureCRT】下载,安装,激活攻略

    以前公司使用的是SSH访问Linux服务器,今天争取了能看到数据,问了同事使用的是secureCRT,然后自己就装了一个. 下载地址:https://www.vandyke.com/download/ ...

  5. jdbc(MySQL)

    1.连接数据库 2.使用配置文件 3.启用连接池 4.事务 JDBC WHAT? 用于执行 SQL 语句的 Java API WHY? 不需要了解每一种数据库连接操作方式 HOW? 加载驱动.获取连接 ...

  6. Linux7.3系统 升级python到3.6使用ping主机脚本

    Linux7.3默认的python系统是2.7.5,然后想着升级使用python3.6.6 1 下载 2 解压  tar fx Python-3.6.6.tgz 3  configure --pref ...

  7. 安装hyperledger fabric V1.0.0-beta

      安装文档位置: https://github.com/hyperledger/fabric   fabric代码托管地址 https://hyperledger-fabric.readthedoc ...

  8. iar stm32 启动代码片段分析

    今天查看了 iar 上面的启动文件,好奇堆栈指针到底是什么时候赋值的,所以就仔细的阅读了代码和相关手册,找到了答案. 首先,芯片启动后,会从ROM的首地址处进行执行,那么我们从 linker 里面找找 ...

  9. bayes公式 - 再从零开始理解

    bayes公式与机器学习 - 再从零开始理解 从本科时候(大约9年前)刚接触Bayes公式,只知道P(A|B)×P(B) = P(AB) = P(B|A)×P(A) 到硕士期间,机器学习课上对P(B| ...

  10. mysql大纲

    一.概述 1.1 关系型数据.非关系型数据.半关系型数据 1.2 关系型数据库和非关系型数据库 1.3 发展史 二.MySQL组件和安装 三.数据库语言和主要概念 3.1 数据库语言 DML.DDL. ...