hive sql在使用中会经常 碰到去除重复数据的操作,一般来说一个关键字distinct
就可以解决,但是distinct的使用场景限制比较多,它是对所选取的所有字段进行比对,只要有一个字段的值不相同就为非重复记录,例如
select
distinct
id,
name
from
table
字段较少的情况下就没问题,能够找出id
、name
都不同的所有记录。
但是现实情况下,有很多业务带有时间戳,例如行为日志,一般来说一个id就确定了一个用户主体,例如我只想取这个用户的一条记录、明确来说是最近的一条行为记录,用distinct就没法做了
思路肯定是将id相同的所有记录按照时间发生的顺序倒排取最后一条,group by
、order by
、limit 1
?貌似实现起来相当恶心。
select
id,
b,
c,
d,
time_stamp,
e,
f,
g
from
(
select
id,
b,
c,
d,
time_stamp,
e,
f,
g,
ROW_NUMBER() OVER(PARTITION BY id, b ORDER BY time_stamp desc) AS rn
from
db.table
)b
where b.rn = 1
解释一下 就是将记录按照id和b字段进行分区,这样同一个id和b字段的记录都将在一个分区内,接下来按照time_stamp 进行排序,row_numer就是获取排序的条数,在外层的b.rn = 1就是只取一条记录。就实现了我们上面提到的需求。
这种用法在处理行为日志记录时会经常用到~
网友评论