我想输出下表:
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排名?
有关如何做到的任何线索?
答案 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
;
基本上我选择与每个用户和国家/地区关联的时间戳的最大值。然后可以对其进行排序并将其连接到原始数据集。