数据准备:

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. python中干掉tornado的连接失败日志

    用了tornado真的是比较舒服,很多事都为你做好了. 但也有不令人满意的地方--对于我这个洁癖来说,自动给我的控制台打印不受我控制的信息是不能忍受的. 连接到一个新的地方,如果失败,tornado会 ...

  2. python函数式编程之yield表达式形式

    先来看一个例子 def foo(): print("starting...") while True: res = yield print("res:",res ...

  3. JavaScript -- 知识点汇总

    js语法 1. javascript数据类型 JavaScript拥有动态类型.这意味着相同的变量可用作不同的类型:有 字符串,数字, 布尔值, 对象, 数组,Undefined和Null 对象: v ...

  4. 笔记:Spring Cloud Ribbon RestTemplate 详解

    详细介绍RestTemplate 针对几种不同请求类型和参数类型的服务调用实现,示例代码中的 restTemplate 都是通过Spring 注入方式创建的,相关代码如下: @Autowired pr ...

  5. 笔记:Hibernate 查询缓存

    Hibernate 的一级缓存和二级缓存都是对实体进行缓存,他不会缓存普通属性,如果想对普通熟悉进行缓存,可以考虑使用查询缓存. 对于查询缓存来说,他缓存的Key就是查询所用的 HQL 或者 SQL ...

  6. 前端的UI设计与交互之图标篇

    图标是具有指代意义的图形,也是一种标识.通过使用图标表达命令,强调状态,表示产品或类别.为了系统及跨平台之间图形认知保持一致, 图标在设计和使用时有以下两个原则点需要注意:简单的图形语言以及高辨识度. ...

  7. 排序算法Java实现(基数排序)

    算法思想:依次按个位.十位...来排序,每一个pos都有分配过程和收集过程,array[i][0]记录第i行数据的个数. package sorting; /** * 基数排序 * 平均O(d(n+r ...

  8. Spring Boot 定时任务的使用

    @Configuration @EnableScheduling public class ScheduleConfig { private final Logger logger = LoggerF ...

  9. c#多线程,进度条,实时给前台发送数据

    ///做了一个wpf多线程,在实际场景中利用多线程保证程序不会卡死,性能上有所提高 //启动线程处理                Thread thread1 = new Thread(Update ...

  10. linux下tomcat无法访问问题(换一种说法:无法访问8080端口)

    有时候linux下的tomcat其他机器无法访问,比如主机无法访问linux虚拟机的tomcat,这是因为tocat的端口,linux没有对外开放,所以只能localhost访问,但是别的机器访问不了 ...