数据准备:

G1,KING,5000
G1,BING,5000
G2,FING,5000
G1,FORD,3000
G2,SCOTT,3000
G1,JONES,2975
G2,BLAKE,2850
G1,CLARK,2450
G1,ALLEN,1600
G1,CELL1,NULL
G2,CELL2,NULL CREATE EXTERNAL TABLE test_data (
gid string,
ename STRING,
sal INT
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile location '/user/jc_rc_ftp/test_data'; select * from test_data l;
+--------+----------+--------+--+
| l.gid | l.ename | l.sal |
+--------+----------+--------+--+
| G1 | CELL1 | NULL |
| G2 | CELL2 | NULL |
| G1 | KING | 5000 |
| G1 | BING | 5000 |
| G2 | FING | 5000 |
| G1 | FORD | 3000 |
| G2 | SCOTT | 3000 |
| G1 | JONES | 2975 |
| G2 | BLAKE | 2850 |
| G1 | CLARK | 2450 |
| G1 | ALLEN | 1600 |
+--------+----------+--------+--+

rank

---rank()over(order by 列名排序)的结果是不连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4

SQL> select gid,ename,sal,rank() over(order by sal desc) from test_data;

---rank() over (partition by 分组字段 order by 排序字段 顺序)

注意:使用rank()over(order by 排序字段 顺序)排序的时候,空值是最大的

select gid,ename,sal,rank()over(partition by gid order by coalesce(sal,0) desc) from test_data;
+------+--------+-------+----------------+--+
| gid | ename | sal | rank_window_0 |
+------+--------+-------+----------------+--+
| G1 | BING | 5000 | 1 |
| G1 | KING | 5000 | 1 |
| G1 | FORD | 3000 | 3 |
| G1 | JONES | 2975 | 4 |
| G1 | CLARK | 2450 | 5 |
| G1 | ALLEN | 1600 | 6 |
| G1 | CELL1 | NULL | 7 |
| G2 | FING | 5000 | 1 |
| G2 | SCOTT | 3000 | 2 |
| G2 | BLAKE | 2850 | 3 |
| G2 | CELL2 | NULL | 4 |
+------+--------+-------+----------------+--+

dense_rank

---dense_rank()over(order by 列名排序)的结果是连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果如:1 1 1 2
如果排序字段为null,可能造成在排序时将null字段排在最前面,影响排序的正确性。
所以建议将 dense_rank()over(order by 列名 排序)改为dense_rank()over(order by 列名排序 nulls last)

---rank()over(order by 列名排序)的结果是不连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4
SQL> select gid,ename,sal,rank() over(order by sal desc) from test_data;
+------+--------+-------+----------------+--+
| gid | ename | sal | rank_window_0 |
+------+--------+-------+----------------+--+
| G2 | FING | 5000 | 1 |
| G1 | BING | 5000 | 1 |
| G1 | KING | 5000 | 1 |
| G2 | SCOTT | 3000 | 4 |
| G1 | FORD | 3000 | 4 |
| G1 | JONES | 2975 | 6 |
| G2 | BLAKE | 2850 | 7 |
| G1 | CLARK | 2450 | 8 |
| G1 | ALLEN | 1600 | 9 |
| G1 | CELL1 | NULL | 10 |
| G2 | CELL2 | NULL | 10 |
+------+--------+-------+----------------+--+ ---rank() over (partition by 分组字段 order by 排序字段 顺序)
注意:使用rank()over(order by 排序字段 顺序)排序的时候,空值是最大的
select gid,ename,sal,rank()over(partition by gid order by coalesce(sal,0) desc) from test_data;
+------+--------+-------+----------------+--+
| gid | ename | sal | rank_window_0 |
+------+--------+-------+----------------+--+
| G1 | BING | 5000 | 1 |
| G1 | KING | 5000 | 1 |
| G1 | FORD | 3000 | 3 |
| G1 | JONES | 2975 | 4 |
| G1 | CLARK | 2450 | 5 |
| G1 | ALLEN | 1600 | 6 |
| G1 | CELL1 | NULL | 7 |
| G2 | FING | 5000 | 1 |
| G2 | SCOTT | 3000 | 2 |
| G2 | BLAKE | 2850 | 3 |
| G2 | CELL2 | NULL | 4 |
+------+--------+-------+----------------+--+ ---dense_rank()over(order by 列名排序)的结果是连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果如:1 1 1 2
如果排序字段为null,可能造成在排序时将null字段排在最前面,影响排序的正确性。
所以建议将 dense_rank()over(order by 列名 排序)改为dense_rank()over(order by 列名排序 nulls last) select gid,ename,sal,dense_rank()over(order by sal desc) from test_data;
+------+--------+-------+----------------------+--+
| gid | ename | sal | dense_rank_window_0 |
+------+--------+-------+----------------------+--+
| G2 | FING | 5000 | 1 |
| G1 | BING | 5000 | 1 |
| G1 | KING | 5000 | 1 |
| G2 | SCOTT | 3000 | 2 |
| G1 | FORD | 3000 | 2 |
| G1 | JONES | 2975 | 3 |
| G2 | BLAKE | 2850 | 4 |
| G1 | CLARK | 2450 | 5 |
| G1 | ALLEN | 1600 | 6 |
| G2 | CELL2 | NULL | 7 |
| G1 | CELL1 | NULL | 7 |
+------+--------+-------+----------------------+--+
select gid,ename,sal,dense_rank()over(partition by gid order by sal desc) from test_data;
+------+--------+-------+----------------------+--+
| gid | ename | sal | dense_rank_window_0 |
+------+--------+-------+----------------------+--+
| G1 | BING | 5000 | 1 |
| G1 | KING | 5000 | 1 |
| G1 | FORD | 3000 | 2 |
| G1 | JONES | 2975 | 3 |
| G1 | CLARK | 2450 | 4 |
| G1 | ALLEN | 1600 | 5 |
| G1 | CELL1 | NULL | 6 |
| G2 | FING | 5000 | 1 |
| G2 | SCOTT | 3000 | 2 |
| G2 | BLAKE | 2850 | 3 |
| G2 | CELL2 | NULL | 4 |
+------+--------+-------+----------------------+--+

Hive函数:rank()、dense_rank()的更多相关文章

  1. Oracle 的开窗函数 rank,dense_rank,row_number

    1.开窗函数和分组函数的区别 分组函数是指按照某列或者某些列分组后进行某种计算,比如计数,求和等聚合函数进行计算. 开窗函数是指基于某列或某些列让数据有序,数据行数和原始数据数相同,依然能曾现个体数据 ...

  2. Hive ROW_NUMBER,RANK(),DENSE_RANK()

    准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100   创建表 CREATE t ...

  3. 知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法

    回到目录 这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍. 一 row_number:它为数据表加一 ...

  4. SQL Server:排名函数row_number,rank,dense_rank,ntile详解

    1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...

  5. Hive学习之路 (十四)Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK

    概述 本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. 注意: 序列函数不支持WINDOW子句.(ROWS BETWEEN) 数据 ...

  6. SQL-OVER与四种排名函数:ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()

    1 SELECT orderid,custid,val, ROW_NUMBER() OVER(ORDER BY val) AS rownum, RANK() OVER(ORDER BY val) AS ...

  7. SQL Server中排名函数row_number,rank,dense_rank,ntile详解

    SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...

  8. 大数据学习day29-----spark09-------1. 练习: 统计店铺按月份的销售额和累计到该月的总销售额(SQL, DSL,RDD) 2. 分组topN的实现(row_number(), rank(), dense_rank()方法的区别)3. spark自定义函数-UDF

    1. 练习 数据: (1)需求1:统计有过连续3天以上销售的店铺有哪些,并且计算出连续三天以上的销售额 第一步:将每天的金额求和(同一天可能会有多个订单) SELECT sid,dt,SUM(mone ...

  9. [转]oracle分析函数Rank, Dense_rank, row_number

    oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number)   目录 ==================== ...

  10. sql server 排名函数:DENSE_RANK

    一.需求 之前sql server 的排名函数用得最多的应该是RoW_NUMBER()了,我通常用ROW_NUMBER() + CTE 来实现分页:今天逛园,看到另一个内置排名函数还不错,自己顺便想了 ...

随机推荐

  1. day1 安装jdk8环境及第一个java程序

    安装jdk8 第一步:下载jdk安装包,我们这里下载orical官网的jdk8版本.

  2. Algorithm --> 快速排序

    快速排序 算法思想 快速排序采用的思想是分治思想. 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的 元素值都 ...

  3. SQL注入之Sqli-labs系列第二篇

    废话不在多说  let's go!   继续挑战第二关(Error Based- String) 同样的前奏,就不截图了 ,and 1=1和and 1=2进行测试,出现报错 还原sql语句 查看源代码 ...

  4. Java8学习(4)-Stream流

    Stream和Collection的区别是什么 流和集合的区别是什么? 粗略地说, 集合和流之间的差异就在于什么时候进行计算.集合是一个内存中的数据结构,它包含数据结构中目前所有的值--集合中的每个元 ...

  5. 关于如何在mac系统上安装Git并在码市上建立项目

    对Git一窍不通,为了在mac系统上安装Git,查了很多资料,走了很多弯路,一切搞定后发现其实很简单. 1.在https://brew.sh上按要求安装Homebrew. 2.在电脑终端键入brew ...

  6. alpha冲刺第九天

    一.合照 二.项目燃尽图 三.项目进展 提问界面完成 财富值界面完成 四.明日规划 继续完善各个内容的界面呈现 继续查找关于如何自动更新爬取内容 五.问题困难 在呈现的时候还是一直会停止运行 爬取先暂 ...

  7. backpropagation

    github: https://github.com/mattm/simple-neural-network blog: https://mattmazur.com/2015/03/17/a-step ...

  8. android数据库持久化框架, ormlite框架,

    前言 Android中内置了SQLite,但是对于数据库操作这块,非常的麻烦.其实可以试用第3方的数据库持久化框架对之进行结构上调整, 摆脱了访问数据库操作的细节,不用再去写复杂的SQL语句.虽然这样 ...

  9. nyoj 寻找最大数(二)

    寻找最大数(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给你一个数字n(可能有前缀0). 要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大.   ...

  10. Junit 4 测试中使用定时任务操作

    难度:测试中执行线程操作 package com.hfepc.job.dataCollection.test; import java.util.Date; import java.util.List ...