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题解

相关推荐
He.ZaoCha26 分钟前
函数-1-字符串函数
数据库·sql·mysql
二当家的素材网34 分钟前
Centos和麒麟系统如何每天晚上2点10分定时备份达梦数据库
linux·数据库·centos
白仑色41 分钟前
Oracle 存储过程、函数与触发器
数据库·oracle·数据库开发·存储过程·plsql编程
黑听人1 小时前
【力扣 困难 C】115. 不同的子序列
c语言·leetcode
头发那是一根不剩了2 小时前
Spring Boot 多数据源切换:AbstractRoutingDataSource
数据库·spring boot·后端
草履虫建模2 小时前
Redis:高性能内存数据库与缓存利器
java·数据库·spring boot·redis·分布式·mysql·缓存
前端拿破轮3 小时前
🤡🤡🤡面试官:就你这还每天刷leetcode?连四数相加和四数之和都分不清!
算法·leetcode·面试
泊浮目3 小时前
未来数据库硬件-计算篇
数据库·云计算·操作系统
靖顺3 小时前
【OceanBase诊断调优】—— 执行计划显示分区 PARTITIONS[P0SP9] 如何查询是哪个分区?
数据库·oracle·oceanbase
KIDAKN4 小时前
MySQL 存储结构
数据库·mysql