分组排序 ---{row_number,rank,dense_rank}

  分组排序常用的是row_number函数,hive中可以使用,但是mysql里没有这个函数。row_number不能满足分组排序的所有场景,比如处理秩。因此,可以考虑其他函数。Talk is cheap,Show me the code。

建立临时表

  新建临时表,插入测试数据。

-- create tabel and insert test data
DROP 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');

picture1

Row_number

  分组排序时,如果出现相同大小的值,随机排序,随机指定大小(不确定,总之不是一样的序号)。一图胜千言,看图说话。

--row_number()
----遇到相同的排序,随机指定大小
SELECT *,
       row_number()over(partition BY id
                        ORDER BY gmt_create ASC) AS rm
FROM parquet_myd.aa_ld_test 

picture2

Rank

  和row_number不同,rank遇到相同排序值,赋予同样的序号,但是下一个值的序号要计算中间相同值的个数。具体逻辑见下图:

--rank()
----遇到x个相等的排序值,则序号相同,均为n,下一个值的序号为n+x+1

SELECT *,
       rank()over(partition BY id
                  ORDER BY gmt_create ASC) AS rm
FROM parquet_myd.aa_ld_test

picture3

Dense_Rank

  和rank类似,遇到相同的值,序号相同,但是下一个值不统计前面相同值的个数,直接+1即可。具体如下:

--DENSE_RANK()
----遇到x个相等的排序值,则序号相同,均为n,下一个值的序号为n+1

SELECT *,
       DENSE_RANK()over(partition BY id
                  ORDER BY gmt_create ASC) AS rm
FROM parquet_myd.aa_ld_test

picture4

Ref

[1] http://www.cnblogs.com/52XF/p/4209211.html

                        2018-06-13 于南京建邺区新城科技园

猜你喜欢

转载自blog.csdn.net/wendaomudong_l2d4/article/details/80679661