使用重复索引创建排名列

时间:2015-07-24 13:57:16

标签: sql hive hiveql

我想输出下表:

User   |   Country   |   RANK
------------------------------
  1          US            3
  1          US            3
  1          NZ            2
  1          NZ            2
  1          NZ            2
  1          JP            1
  2          US            2
  2          US            2
  2          US            2
  2          CA            1

我所拥有的是“用户”和“国家/地区”列,并希望创建RANK列。

我尝试使用函数rank()之类的 rank() over (partition by User, Country order by ct desc)其中ct只是epoch以来的事件发生时间,但不是给出一些重复的数字,如33 222 1,它在分区内排名,给我12 123 1。

我也试过row_number()但没有成功。

如果我使用rank() over (partition by User order by country desc)它有效,但我如何保证它也按ct排名?

有关如何做到的任何线索?

1 个答案:

答案 0 :(得分:2)

您对数据架构非常模糊。但假设您的数据如下所示:

User  Country  Unix_time(epoch)
1     US       1437888888
1     NZ       1437666666
2     US       1437777777
2     NZ       1435555555

我认为这样可行但我无法测试,因为我的笔记本电脑上没有蜂巢。

select c.*, b.rank 
from my_table c
left outer join
(select user
    , country
    , rank() over (partition by user, order by unix_time desc) as rank
    from 
        (select user, country, max(unix_time) as unix_time
        from my_table group by user, country
        ) a
) b
on c.user=b.user and c.country=b.country
;

基本上我选择与每个用户和国家/地区关联的时间戳的最大值。然后可以对其进行排序并将其连接到原始数据集。