Hive函数:rank()、dense_rank()
数据准备:
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()的更多相关文章
- Oracle 的开窗函数 rank,dense_rank,row_number
1.开窗函数和分组函数的区别 分组函数是指按照某列或者某些列分组后进行某种计算,比如计数,求和等聚合函数进行计算. 开窗函数是指基于某列或某些列让数据有序,数据行数和原始数据数相同,依然能曾现个体数据 ...
- Hive ROW_NUMBER,RANK(),DENSE_RANK()
准备数据 浙江,杭州,300 浙江,宁波,150 浙江,温州,200 浙江,嘉兴,100 江苏,南京,270 江苏,苏州,299 江苏,某市,200 江苏,某某市,100 创建表 CREATE t ...
- 知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法
回到目录 这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍. 一 row_number:它为数据表加一 ...
- SQL Server:排名函数row_number,rank,dense_rank,ntile详解
1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...
- Hive学习之路 (十四)Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANK
概述 本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途. 注意: 序列函数不支持WINDOW子句.(ROWS BETWEEN) 数据 ...
- 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 ...
- SQL Server中排名函数row_number,rank,dense_rank,ntile详解
SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...
- 大数据学习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 ...
- [转]oracle分析函数Rank, Dense_rank, row_number
oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number) 目录 ==================== ...
- sql server 排名函数:DENSE_RANK
一.需求 之前sql server 的排名函数用得最多的应该是RoW_NUMBER()了,我通常用ROW_NUMBER() + CTE 来实现分页:今天逛园,看到另一个内置排名函数还不错,自己顺便想了 ...
随机推荐
- Android库项目中的资源ID冲突
1.前言 Android Studio对模块化开发提供的一个很有用的功能就是可以在主项目下新建库项目(Module),但是在使用库项目时却有一个问题就是资源ID冲突,因为编译时SDK会自动帮我们处理这 ...
- analyzing problems
If you talking to a friend or talking to a family member ,you can say:what's the metter or What's go ...
- struts2.0简单教程
Struts2.0简单配置教程: 在Eclipse中配置Struts2 步骤一:首先打开java ee并建立一个动态网站项目,我建立的项目名为TestDemo,如下图: 建立之后可在左侧发现工程,展开 ...
- Django——ORM
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- class 选择器
class 选择器 1.class 选择器用于描述一组元素的样式,class 选择器有别于id选择器,class可以在多个元素中使用. 2.class 选择器在HTML元素中以class属性(即cla ...
- codeforce round#466(div.2) B. Our Tanya is Crying Out Loud
B. Our Tanya is Crying Out Loud time limit per test1 second memory limit per test256 megabytes input ...
- 小米官网的css3导航菜单
HTML代码: <div class="nav"> <ul> <li><a href="#">首页</a& ...
- 关于css的text-indent首行缩进两个字符和图片缩进的问题
段落前面空两个字的距离,不要再使用空格了.应该使用首行缩进text-indent. text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字. <style typ ...
- JavaScript(第四天)【运算符】
ECMA-262描述了一组用于操作数据值的运算符,包括一元运算符.布尔运算符.算术运算符.关系运算符.三元运算符.位运算符及赋值运算符.ECMAScript中的运算符适用于很多值,包括字符串.数值.布 ...
- 20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计
20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 ...