hive 输出一段时间内每天的连续留存

连续留存:某日登录的用户,在之后连续几天是否活跃,次日留存就是用户注册后第二天仍然活跃,第三日留存就是第二天第三天是否连续登录。

通过用户登陆表join登陆表处理,联表后输出结果,尝试过不联表处理,但是在处理date的时候不group by 就会出现列名不存在的提示,group by后又会出现按日期分组无法统计对一个日期后的记录进行处理。

join后输出结果第一列ID,第二列登录时间,第三列后续登录时间,然后在对后续时间进行判断。

 WHEN b.riqi2 = date_add(a.riqi,1) THEN 1
                  WHEN b.riqi2 = date_add(a.riqi,2) THEN 10
                  WHEN b.riqi2 = date_add(a.riqi,3) THEN 100
                  WHEN b.riqi2 = date_add(a.riqi,4) THEN 1000
                  WHEN b.riqi2 = date_add(a.riqi,5) THEN 10000
                  WHEN b.riqi2 = date_add(a.riqi,6) THEN 100000

这里相当于将玩家一个日期后的登录记录转换为二进制表示。111111表示后面连续6天都登陆,

完整语句如下:

SELECT c.date1,
       count(*),
            count(CASE
                      WHEN pmod(c.panduan,10) = 1 THEN role_id
                      ELSE NULL
                  END) AS shouri,
            count(CASE
                      WHEN pmod(c.panduan,100) = 11 THEN role_id
                      ELSE NULL
                  END) AS yiri,
            count(CASE
                      WHEN pmod(c.panduan,1000) = 111 THEN role_id
                      ELSE NULL
                  END) AS erri,
            count(CASE
                      WHEN pmod(c.panduan,10000) = 1111 THEN role_id
                      ELSE NULL
                  END) AS sanri,
            count(CASE
                      WHEN pmod(c.panduan,100000) = 11111 THEN role_id
                      ELSE NULL
                  END) AS siri
FROM
  (SELECT a.id,
          a.riqi AS date1,
          sum(CASE
                  WHEN b.riqi2 = date_add(a.riqi,1) THEN 1
                  WHEN b.riqi2 = date_add(a.riqi,2) THEN 10
                  WHEN b.riqi2 = date_add(a.riqi,3) THEN 100
                  WHEN b.riqi2 = date_add(a.riqi,4) THEN 1000
                  WHEN b.riqi2 = date_add(a.riqi,5) THEN 10000
                  WHEN b.riqi2 = date_add(a.riqi,6) THEN 100000
                  ELSE 0
              END) AS panduan
   FROM
     (SELECT id,
             from_unixtime(unix_timestamp(`date`,'yyyymmdd'),'yyyy-mm-dd') AS riqi
      FROM denglu
      WHERE `date` BETWEEN '20230309' AND '20230323'
      GROUP BY role_id,
               `date`)a
   LEFT JOIN
     (SELECT id
             from_unixtime(unix_timestamp(`date`,'yyyymmdd'),'yyyy-mm-dd') AS riqi2
      FROM denglu
      WHERE `date` BETWEEN '20230309' AND '20230323'
      GROUP BY role_id,
               `date`)b ON a.id = b.id
   GROUP BY id,
            riqi)c
GROUP BY date1

技术有限,比较小白,如果有更好的方法,欢迎指点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值