Hive SQL必刷练习题:留存率问题

首次登录算作当天新增,第二天也登录了算作一日留存。可以理解为,在10月1号登陆了。在10月2号也登陆了,那这个人就可以算是在1号留存

今日留存率 = (今日登录且明天也登录的用户数) / 今日登录的总用户数 * 100%

解决思路:

​ 这类问题主要借助left join,根据原表的数据,先去找到每个用户最先登录的时间,这个就是通过对用户group by,然后搜索date_format(min(login_ts),'yyyy-MM-dd')。这样就得到一个表,第一列是用户id,第二列就是每一个用户第一次登录的日期。

​ 之后用这个新表,left join原表数据,但是这个条件不仅是id相等,还要有个t1.user_id=t2.user_id and datediff(date_format(t2.login_ts,'yyyy-MM-dd'),t1.first_login)=1

说实话,这个多条件join的还确实没遇到过。这样符合条件的就会被增加到后面,不符合的赋空值。【当然也可以不多条件join,直接就是两个表的user_id一样,那这样再计算新增人数和留存人数的时候,就不能直接通过count(列名字)来计算了,还需要去重和判断天数关系】比如下图这样

这样就可以根据first_login 分组group by 计算countt1.id),就是每日新增人数,然后count(连接上的表的列信息),就是后续一天也登陆的人数。

代码:

sql 复制代码
select
  t3.first_login,
  t3.register,
  t3.remain_1/t3.register retention
from
  (
   select
     t1.first_login,
     count(t1.user_id) register,
     count(t2.user_id) remain_1
   from
     (
      select
        user_id,
        date_format(min(login_ts),'yyyy-MM-dd')   first_login
      from
        user_login_detail
      group by
        user_id
      )t1
   left join
     user_login_detail t2
   on
     t1.user_id=t2.user_id and datediff(date_format(t2.login_ts,'yyyy-MM-dd'),t1.first_login)=1
   group by
     t1.first_login
)t3

总结一下:

其实这类问题的关键在于,你要想办法将每个用户的最初登录时间和第二天登录时间这两个信息,放到一行中。这就是先求出来初次登陆时间后,然后借助这个表进行left join,之后再此基础上以最初登录时间进行分组group by,再用聚合函数即可。

相关推荐
优氙费控5 小时前
电子发票报销怎么管理?采集、验真、报销、归档全流程
大数据·人工智能
Leo.yuan6 小时前
2026 年内网数据分析 Agent 选型:私有化部署、信创适配与安全合规的评估框架
大数据
AgentMaster6 小时前
数据资产化落地难题:5款数据中台系统架构对比与实施记录
大数据·人工智能·算法
织码weavecodes6 小时前
离线学习与多端进度同步:在线心跳、Redis 缓冲与断点续考技术实现
大数据·自动化
知识的搬运工旺仔6 小时前
CREATE INDEX CONCURRENTLY:线上建索引不阻塞 DML 的代价与坑
数据库·后端·sql
IT毕设实战小研6 小时前
基于大数据的商场商铺数据分析与可视化的设计与实现
android·java·大数据·django·课程设计
智慧物业老杨7 小时前
人机协同的物业服务重构:技术落地路径与系统化思考
java·大数据·人工智能·重构·系统架构
汇智信科7 小时前
汇智信科-大型设备监控和故障诊断系统
大数据·汇智信科
浅思科技集7 小时前
青岛专业GEO优化推广服务商观察:从AI“沉默”到AI“推荐”,企业如何重建品牌可见度
大数据
天天喝旺仔8 小时前
MySQL索引优化实战:B+Tree原理、索引失效与覆盖索引调优
数据库·sql·mysql·性能优化