hive sql去重--sql取最近一条记录

hive sql在使用中会经常 碰到去除重复数据的操作,一般来说一个关键字distinct就可以解决,但是distinct的使用场景限制比较多,它是对所选取的所有字段进行比对,只要有一个字段的值不相同就为非重复记录,例如

select
    distinct
    id,
    name
from
    table

字段较少的情况下就没问题,能够找出idname都不同的所有记录。

但是现实情况下,有很多业务带有时间戳,例如行为日志,一般来说一个id就确定了一个用户主体,例如我只想取这个用户的一条记录、明确来说是最近的一条行为记录,用distinct就没法做了
思路肯定是将id相同的所有记录按照时间发生的顺序倒排取最后一条,group byorder bylimit 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就是只取一条记录。就实现了我们上面提到的需求。

这种用法在处理行为日志记录时会经常用到~

你可能感兴趣的:(hive sql去重--sql取最近一条记录)