app开发者平台在数字化时代的重要性与发展趋势解析
1249
2022-09-02
Hive01---分组排序{row_number,rank,dense_rank}
分组排序常用的是row_number函数,hive中可以使用,但是mysql里没有这个函数。row_number不能满足分组排序的所有场景,比如处理秩。因此,可以考虑其他函数。Talk is cheap,Show me the code。
建立临时表
新建临时表,插入测试数据。
-- create tabel and insert test dataDROP TABLE IF EXISTS parquet_myd.aa_ld_test;CREATE TABLE parquet_myd.aa_ld_test (id int ,name string ,value int,gmt_create timestamp);INSERT INTO TABLE parquet_myd.aa_ld_test(id,name,value,gmt_create) VALUES (1,'A',10,'2018-05-20 18:30:30'),(1,'A',20,'2018-05-20 18:30:30'),(1,'A',30,'2018-05-20 19:30:30'),(2,'A',40,'2018-05-20 18:30:30'),(2,'A',50,'2018-05-20 19:30:30');
Row_number
分组排序时,如果出现相同大小的值,随机排序,随机指定大小(不确定,总之不是一样的序号)。一图胜千言,看图说话。
--row_number()----遇到相同的排序,随机指定大小SELECT *, row_number()over(partition BY id ORDER BY gmt_create ASC) AS rmFROM parquet_myd.aa_ld_test
Rank
和row_number不同,rank遇到相同排序值,赋予同样的序号,但是下一个值的序号要计算中间相同值的个数。具体逻辑见下图:
--rank()----遇到x个相等的排序值,则序号相同,均为n,下一个值的序号为n+x+1SELECT *, rank()over(partition BY id ORDER BY gmt_create ASC) AS rmFROM parquet_myd.aa_ld_test
Dense_Rank
和rank类似,遇到相同的值,序号相同,但是下一个值不统计前面相同值的个数,直接+1即可。具体如下:
--DENSE_RANK()----遇到x个相等的排序值,则序号相同,均为n,下一个值的序号为n+1SELECT *, DENSE_RANK()over(partition BY id ORDER BY gmt_create ASC) AS rmFROM parquet_myd.aa_ld_test
Ref
2018-06-13 于南京建邺区新城科技园
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~