Hive每日交易排名求助:实现同trx值无重复排名
嘿,我来帮你解决这个Hive排名的问题!
从你的需求来看,核心是按日期分组对交易数据排名,且相同trx值的排名不能重复——说白了就是每个行都要有唯一的排名,不能出现并列的情况对吧?
解决思路:用Hive的ROW_NUMBER()窗口函数
Hive里的窗口函数正好能搞定这个场景,其中ROW_NUMBER()就是专门用来生成唯一序号的,不管你的trx值是否重复,它都会给每个分组内的行分配一个不重复的排名。
具体SQL示例
假设你的表名叫transaction_data,字段是date、hour、trx,那对应的SQL可以这么写:
SELECT date, hour, trx, -- 按日期分组,trx降序排列生成唯一排名 ROW_NUMBER() OVER (PARTITION BY date ORDER BY trx DESC) AS rnk FROM transaction_data;
关键逻辑说明
PARTITION BY date:把数据按日期拆分,确保每天的交易数据单独进行排名,不会和其他日期的混在一起。ORDER BY trx DESC:指定排名的依据,这里是按trx从大到小排(如果需要从小到大排名,改成ASC就行)。ROW_NUMBER():这个函数会给每个分组内的行按顺序分配唯一的数字序号,哪怕有多个行的trx值完全相同,它们的排名也不会重复——完美匹配你的需求!
为啥不用RANK()或DENSE_RANK()?
顺便给你提下另外两个排名函数的区别,避免踩坑:
RANK():如果有相同值的行,会给它们相同的排名,但下一个排名会跳过对应的位数(比如两个第1名,下一个就是第3名)。DENSE_RANK():相同值的行也会有相同排名,但下一个排名不会跳号(两个第1名,下一个是第2名)。
这两个都会出现重复的排名,不符合你的要求,所以咱们就用ROW_NUMBER()就对了。
内容的提问来源于stack exchange,提问作者galih
相关产品推荐
相关产品推荐

