Hadoop离线_hive的窗口函数

本文详细介绍了SQL中的topN窗口函数rank(), denserank(), row_number()在实际案例中的应用,通过f_test表展示它们在数据排名中的区别。rank()可能遗漏序号,denserank()保持连续,row_number()按顺序计数,帮助理解窗口函数在数据处理中的实用性。
摘要由CSDN通过智能技术生成


1.概述

求取topN窗口函数三兄弟:
rank() over
dense rank() over
row_number() over

2.案例

2.1案例表:
select * from f_test

+------------+--------------+-------------+--+
| f_test.id  | f_test.name  | f_test.sal  |
+------------+--------------+-------------+--+
| 1          | a            | 10          |
| 2          | a            | 12          |
| 3          | b            | 13          |
| 4          | b            | 12          |
| 5          | a            | 14          |
| 6          | a            | 15          |
| 7          | a            | 13          |
| 8          | b            | 11          |
| 9          | a            | 16          |
| 10         | b            | 17          |
| 11         | a            | 14          |
+------------+--------------+-------------+--+

2.2 三种窗口函数求topN

SELECT id,name,sal,
RANK() over(PARTITION by name ORDER BY sal DESC) rp,
DENSE_RANK() over(PARTITION by name ORDER BY sal DESC) drp,
ROW_NUMBER() over(PARTITION by name ORDER BY sal DESC) rmp
FROM f_test;

2.3 结果

+-----+-------+------+-----+------+------+--+
| id  | name  | sal  | rp  | drp  | rmp  |
+-----+-------+------+-----+------+------+--+
| 9   | a     | 16   | 1   | 1    | 1    |
| 6   | a     | 15   | 2   | 2    | 2    |
| 11  | a     | 14   | 3   | 3    | 3    |
| 5   | a     | 14   | 3   | 3    | 4    |
| 7   | a     | 13   | 5   | 4    | 5    |
| 2   | a     | 12   | 6   | 5    | 6    |
| 1   | a     | 10   | 7   | 6    | 7    |
| 10  | b     | 17   | 1   | 1    | 1    |
| 3   | b     | 13   | 2   | 2    | 2    |
| 4   | b     | 12   | 3   | 3    | 3    |
| 8   | b     | 11   | 4   | 4    | 4    |
+-----+-------+------+-----+------+------+--+

rank() over是给出了相同的序号3,然后直接跳到5,所以他最后的序号要比实际数据数量少
dense rank() over同样给出了相同的序号3,但是是接着顺序给出了4,最后序号和实际数据数量相同
row_number() over则是单纯地按照顺序进行排序,不受相同name影响

partition by就相当于group by,但是这里不能替换为group by,而且partition by后只能跟一个字段,group by可以跟多个字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值