Hive--开窗函数--窗口分析函数:ROW_NUMBER、RANK、DENSE_RANK、NTILE

分析函数:ROW_NUMBER、RANK、DENSE_RANK、NTILE、cume_dist、percent_rank

总结:

ROW_NUMBER、RANK、DENSE_RANK --并列的话123 113 112

  • 不指定窗口时,不排序默认第一行到最后一行,排序默认第一行到当前行

  • 指定窗口时 --rows between 起始位置 and 结束位置

    • N preceding:往前多少行
    • N following:往后多少行
    • current row:当前行
    • unbounded:起点或者终点,没有边界
    • unbounded preceding 表示从前面的起点
    • unbounded following:表示到后面的终点
  • ROW_NUMBER

    • 功能:用于实现分区内记录编号
    • 语法:row_number() over (partition by col1 order by col2)
  • RANK

    • 功能:用于实现分区内排名编号[会留空位]
    • 语法:rank() over (partition by col1 order by col2)
  • DENSE_RANK

    • 功能:用于实现分区内排名编号[不留空位]
    • 语法:dense_rank() over (partition by col1 order by col2)
  • NTILE

    • 功能:将每个分区内排序后的结果均分成N份【如果不能均分,优先分配编号小的】
    • 本质:将每个分区拆分成更小的分区
    • 语法:NTILE(N) over (partition by col1 order by col2)
  • cume_dist

    • 功能:计算某个窗口或分区中某个值的累积分布。
    • 语法:cume_dist(N) over (partition by col1 order by col2)
    • 假定升序排序,则使用以下公式确定累积分布:小于等于当前值x的行数 / 窗口或partition分区内的总行数。其中,x 等于 order by 子句中指定的列的当前行中的值。
  • percent_rank

    • 功能:返回某列或某列组合后每行的百分比排序
    • 语法:percent_rank(N) over (partition by col1 order by col2)
    • 可以用来计算超过了百分之多少的人。(当前行的rank值-1)/(分组内的总行数-1)

ROW_NUMBER[重点]

  • 功能:用于实现分区内记录编号
  • 语法:row_number() over (partition by col1 order by col2)
  • 示例:统计每个部门薪资最高的前两名
select
  empno,
  ename,
  salary,
  deptno,
  row_number() over (partition by deptno order by salary desc) as numb
from
  db_emp.tb_emp;
  
--此时为排名,要求取前两名,作为临时表t再套一层查询即可

select 
* 
from 
	(select
		  empno,
		  ename,
		  salary,
		  deptno,
		  row_number() over (partition by deptno order by salary desc) as numb
	from
	  db_emp.tb_emp) t 
where t.numb < 3;
  
+--------+---------+---------+---------+-------+--+
| empno  |  ename  | salary  | deptno  | numb  |
+--------+---------+---------+---------+-------+--+
| 7839   | KING    | 5000.0  | 10      | 1     |
| 7782   | CLARK   | 2450.0  | 10      | 2     |
| 7934   | MILLER  | 1300.0  | 10      | 3     |
| 7788   | SCOTT   | 3000.0  | 20      | 1     |
| 7902   | FORD    | 3000.0  | 20      | 2     |
| 7566   | JONES   | 2975.0  | 20      | 3     |
| 7876   | ADAMS   | 1100.0  | 20      | 4     |
| 7369   | SMITH   | 800.0   | 20      | 5     |
| 7698   | BLAKE   | 2850.0  | 30      | 1     |
| 7499   | ALLEN   | 1600.0  | 30      | 2     |
| 7844   | TURNER  | 1500.0  | 30      | 3     |
| 7654   | MARTIN  | 1250.0  | 30      | 4     |
| 7521   | WARD    | 1250.0  | 30      | 5     |
| 7900   | JAMES   | 950.0   | 30      | 6     |
+--------+---------+---------+---------+-------+--+  

RANK

  • 功能:用于实现分区内排名编号[会留空位]
  • 与row_number的区别:
    • row_number:如果排序时数值相同,继续编号
    • rank:如果排序时数值相同,编号相同,但留下空位
  • 语法:rank() over (partition by col1 order by col2)
  • 示例:统计每个部门薪资排名
select
  empno,
  ename,
  salary,
  deptno,
  rank() over (partition by deptno order by salary desc) as numb
from
  db_emp.tb_emp;
  
+--------+---------+---------+---------+-------+--+
| empno  |  ename  | salary  | deptno  | numb  |
+--------+---------+---------+---------+-------+--+
| 7839   | KING    | 5000.0  | 10      | 1     |
| 7782   | CLARK   | 2450.0  | 10      | 2     |
| 7934   | MILLER  | 1300.0  | 10      | 3     |
| 7788   | SCOTT   | 3000.0  | 20      | 1     |
| 7902   | FORD    | 3000.0  | 20      | 1     |
| 7566   | JONES   | 2975.0  | 20      | 3     |
| 7876   | ADAMS   | 1100.0  | 20      | 4     |
| 7369   | SMITH   | 800.0   | 20      | 5     |
| 7698   | BLAKE   | 2850.0  | 30      | 1     |
| 7499   | ALLEN   | 1600.0  | 30      | 2     |
| 7844   | TURNER  | 1500.0  | 30      | 3     |
| 7654   | MARTIN  | 1250.0  | 30      | 4     |
| 7521   | WARD    | 1250.0  | 30      | 4     |
| 7900   | JAMES   | 950.0   | 30      | 6     |
+--------+---------+---------+---------+-------+--+ 

DENSE_RANK【重点】

  • 功能:用于实现分区内排名编号[不留空位]
  • 与rank的区别:
    • rank:如果排序时数值相同,编号不变,并留下排名空位
    • dense_rank:如果排序时数值相同,编号不变,不留空位
  • 语法:dense_rank() over (partition by col1 order by col2)
  • 示例:统计每个部门薪资排名
select
  empno,
  ename,
  salary,
  deptno,
  dense_rank() over (partition by deptno order by salary desc) as numb
from
  db_emp.tb_emp; 

NTILE

  • 功能:将每个分区内排序后的结果均分成N份【如果不能均分,优先分配编号小的】
  • 本质:将每个分区拆分成更小的分区
  • 语法:NTILE(N) over (partition by col1 order by col2)
  • 示例:统计每个部门薪资排名,将每个部门的薪资分为两个部分,区分高薪和低薪
select
  empno,
  ename,
  salary,
  deptno,
  NTILE(2) over (partition by deptno order by salary desc) as numb
from
  db_emp.tb_emp; 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive中,rankrow_number是两个常用的排序函数,它们之间有一些区别。首先,rank函数用于为具有相同值的行分配相同的排名,并跳过下一个排名值。例如,如果有两个学生的成绩相同,则它们将被分配相同的排名,下一个排名将被跳过。所以,使用rank函数时,可能会出现排名的不连续情况。另一方面,row_number函数会为每一行分配一个唯一的排名,不管是否有重复的值。因此,如果有两个学生的成绩相同,它们将被分配不同的排名。所以使用row_number函数时,排名是连续的。这是rank函数row_number函数之间的主要区别。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [sql 四大排名函数---(ROW_NUMBERRANKDENSE_RANK、NTILE)简介](https://blog.csdn.net/shaiguchun9503/article/details/82349050)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [hivedense_rankrow_numberrank函数](https://blog.csdn.net/JAVA_LuZiMaKei/article/details/119732001)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值