Hive之间隔连续问题

本文介绍了如何通过SQL查询,利用lag函数和分区技术解决间隔连续登录的问题,计算每个用户最长的连续登录天数。首先按ID和登录日期去重,然后使用lag功能判断登录间隔,最后汇总得到每个用户的最长连续登录天数。
摘要由CSDN通过智能技术生成

间隔连续问题本质上是分区问题,即将对每个id每次连续登录分为一个区,然后根据最大登录日期减最小登陆日期 + 1

---首先按照id和登录时间(substring)去重,然后使用lag开窗
with
  t1 as (
    SELECT
      user_id,
      substring(login_datetime, 0, 10) as login_day
    FROM
      login_events
    group by
      user_id,
      substring(login_datetime, 0, 10)
  ),
  ----然后使用lag开窗,按照user_id分区,login_day生序排序,取上一个日期,
  ---计算与当前login_day的差值,大于2则记为1都则为0  
  t2 as (
    SELECT
      user_id,
      login_day,
      if (
        datediff (
          login_day,
          lag (login_day) over (
            PARTITION by
              user_id
            order by
              login_day asc
          )
        ) > 2,
        1,
        0
      ) flag
    FROM
      t1
  ), ----按照id分组,day排序,使用sum函数累加flag,对每次连续登录分区号,
  t3 as (
    SELECT
      user_id,
      login_day,
      sum(flag) over (
        PARTITION by
          user_id
        order by
          login_day asc
      ) as par
    FROM
      t2
  ),
  -------按照user_id,par分组,由最大登录天-最小+1,求得每个用户的连续登录天数
  t4 as (
    select
      user_id,
      datediff (max(login_day), min(login_day)) + 1 as day_count
    from
      t3
    group by
      user_id,
      par
  )
  --------按照user_id分组,求得每个用户的最长连续登录天数
SELECT
  user_id,
  max(day_count) as max_day_count
FROM
  t4
GROUP by
  user_id

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值