大家好,欢迎来到IT知识分享网。
前言
在数据分析中经常对某个维度数据进行排名后取TopN,Hive中有rank()、dense_rank()、row_number()三个窗口函数,它们的区别如何呢?下面通过实际例子说明,让你一目了然。
代码演示
- rank():排序时相同结果的排序相同,但是排序编号非连续的。
-- id是学生编号,socre是学生分数 SELECT id, score, rank() OVER (PARTITION BY 1 ORDER BY score DESC) AS `排名` FROM ( SELECT 1 AS id, 90.0 AS score UNION ALL SELECT 2 AS id, 91.0 AS score UNION ALL SELECT 3 AS id, 92.0 AS score UNION ALL SELECT 4 AS id, 92.0 AS score UNION ALL SELECT 5 AS id, 93.0 AS score UNION ALL SELECT 6 AS id, 94.0 AS score ) t
- dense_rank():排序时相同结果的排序相同,并且排序编号连续的。
如果rank()和dense_rank()记不住,想一下dense英语意思是“密集的”,就是排名挨着就好记了。
-- id是学生编号,socre是学生分数 SELECT id, score, dense_rank() OVER (PARTITION BY 1 ORDER BY score DESC) AS `排名` FROM ( -- 临时表和上面一样这里忽略 ) t
- row_number():排序时相同结果的排序不同,分数相同的是随机排,并且排序编号连续的。
-- id是学生编号,socre是学生分数 SELECT id, score, row_number() OVER (PARTITION BY 1 ORDER BY score DESC) AS `排名` FROM ( -- 临时表和上面一样这里忽略 ) t
高级演示
窗口函数的窗口如何理解呢?简单理解就是窗口内的数据一样,即根据partition by 的字段对数据分区,只有相同的数据才会分到一个窗口内。上面例子partition by 后面是个常量,意思是将所有数据放到一个窗口。如果还不理解下面的例子会让你彻底明白,继续看![给力]
需求:对班级中每个学生自己的各科成绩进行排名,并取出每个学生排名第一的课程和成绩。学生id对应学科成绩的数据集如下:
-- id是学生编号,course学科名,socre是学生分数 SELECT * FROM ( SELECT id, course, score, row_number() OVER (PARTITION BY id ORDER BY score DESC) AS `排名` FROM ( SELECT 1 AS id, '语文' AS course, 95.0 AS score UNION ALL SELECT 1 AS id, '数学' AS course, 91.0 AS score UNION ALL SELECT 1 AS id, '英语' AS course, 92.0 AS score UNION ALL SELECT 2 AS id, '语文' AS course, 85.0 AS score UNION ALL SELECT 2 AS id, '数学' AS course, 81.0 AS score UNION ALL SELECT 2 AS id, '英语' AS course, 82.0 AS score UNION ALL SELECT 3 AS id, '语文' AS course, 75.0 AS score UNION ALL SELECT 3 AS id, '数学' AS course, 80.0 AS score UNION ALL SELECT 3 AS id, '英语' AS course, 72.0 AS score ) t ) tt WHERE `排名`=1
结果很明显,都取到了每个学生的排名第一的学科和成绩,看到执行结果后,窗口函数是不是就很容易理解了!!![666]
随便再看下不加WHERE `排名`=1 条件的结果是什么,如下图,相当于对每个学生的学科成绩进行了排名:
思考
这里为什么用ROW_NUMBER()而不用其他两个呢?因为取的是Top1,其实用其他两个函数结果都一样。如果每个窗口取的结果不是一个时,那就要按要求使用上面不同的函数了。
你的点赞是对我的认可,你的收藏是对我的鼓励,关注我更多有价值的文章会第一时间推荐给你![玫瑰][玫瑰][玫瑰]
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/159410.html