SQL刷题---2021年11月每天新用户的次日留存率


解题思路:

1.首先算出每个新用户注册的日期,将其命名为表a

select uid,min(date(in_time)) dt 
from tb_user_log
group by uid

2.计算出每个用户登录的天数,将其命名为表b

select uid,date(in_time) dt from tb_user_log
union
select uid,date(out_time) dt from tb_user_log

3.以表a为主与表b进行连接,过滤条件为同一个用户在表b中的日期比表a中日期多一天,根据此结果计算留存率

select 
    a.dt,
    ifnull(round(count(b.uid)/count(a.uid),2),0)uv_left_rate
from
    # 每个用户最初注册的日期
    (SELECT uid,date(min(in_time)) dt
    FROM tb_user_log
    GROUP BY uid) a 
# 把日期拆分成登陆和退出日期,再通过uid联立表
# 查找每个用户注册日期增加1天后的日期是否在登陆和退出日期当中
left join
    (
    SELECT uid,DATE(in_time) dt
    FROM tb_user_log
    union
    SELECT uid,DATE(out_time) dt
    FROM tb_user_log
    ) b 
ON a.uid = b.uid
# 每个uid在初次登陆日期的第二天
and b.dt = DATE_ADD(a.dt,INTERVAL 1 DAY)
# WHERE的时机,在全部表联合完之后进行筛选
WHERE a.dt like "2021-11%"
GROUP BY a.dt
ORDER BY a.dt;

SQL题解:SQL题解

相关推荐
躺平的花卷4 分钟前
Python爬虫案例六:抓取某个地区某月份天气数据并保存到mysql数据库中
数据库·爬虫·python·mysql
Flying_Fish_roe17 分钟前
linux-安全管理-防火墙与网络安全
linux·数据库·oracle
A_cot28 分钟前
Redis 的三个并发问题及解决方案(面试题)
java·开发语言·数据库·redis·mybatis
2401_847056551 小时前
Altium Designer脚本工具定制
网络·数据库
神仙别闹1 小时前
基于Python+SQLite的课程管理系统
数据库·sqlite
掐指一算乀缺钱1 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
少年负剑去2 小时前
django分发路由
数据库·django·sqlite
飞翔的佩奇2 小时前
xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
数据库·spring boot·mysql·sqlite·xxl-job·任务调度
吱吱鼠叔2 小时前
MATLAB数据文件读写:1.格式化读写文件
前端·数据库·matlab
小哇6662 小时前
spring-TransactionTemplate 编程式事务
数据库·spring