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

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

select
    distinct
    id,
    name
from
    table

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

但是现实情况下,有很多业务带有时间戳,例如行为日志,一般来说一个id就确定了一个用户主体,例如我只想取这个用户的一条记录、明确来说是最近的一条行为记录,用distinct就没法做了
思路肯定是将id相同的所有记录按照时间发生的顺序倒排取最后一条,group by、order by 、limit 1?貌似实现起来相当恶心。

hive sql提供了 一个函数来解决这个问题:

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就是只取一条记录。就实现了我们上面提到的需求。

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

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值