今天碰到一个小bug,虽然说不是非常严重,但是也花了一点时间来排查。当我们用hive的rank()或者row_number()函数的时候,一般会根据里面的某个唯一列(例如user_id)进行分区,然后order by他的某个时间字段(例如update_time),比如我们需要求某个用户每天登陆的最后登录时间,登录表里面用户可能有多条登录信息,那么我们可能要把数据清洗去重,得到登录时间最晚的那一条记录,此时可以用到开窗函数,整体的写法为:row_number() over(partition by user_id order by update_time desc) as rn,然后子查询 where rn=1,这样一来我们就得到了用户某一天的最后一条登录信息,但是有这么一种情况,当用户为新用户,他的这个update_time可能在有些逻辑下被设为null,对应的就没有这个修改时间,当我们用order by排序的时候,这行数据默认就会跑到第一行,所以就取不到他的最晚登录时间,那么我们可以用 nvl()函数,写法为,nvl(update_time,"1"),这个1可以为任意不大于最晚登录时间的字符串。
当然还有对应的可以用 group by user_id,max(update_time)这种方法取到最晚时间
553

被折叠的 条评论
为什么被折叠?



