SQL面试题:手写7日留存

文章描述了在阿里云MaxCompute中进行数据库操作,包括创建表并插入用户登录记录,然后通过SQL查询统计不同日期范围内的用户登录活跃度。
摘要由CSDN通过智能技术生成

环境

阿里云,maxcompute

初始化

DROP TABLE IF EXISTS t_user_login;
CREATE TABLE IF NOT EXISTS t_user_login(
    user_id                    STRING COMMENT '用户id',
    login_time                  STRING COMMENT '登录时间'
) COMMENT '用户登录表';

INSERT INTO t_user_login 
SELECT 'user_1', '2023-10-28 12:26:10'
UNION
SELECT 'user_1', '2023-10-27 12:26:10'
UNION
SELECT 'user_2', '2023-10-27 12:26:10'
UNION
SELECT 'user_1', '2023-10-26 12:26:10'
UNION
SELECT 'user_2', '2023-10-26 12:26:10'
UNION
SELECT 'user_3', '2023-10-26 12:26:10'
UNION
SELECT 'user_1', '2023-10-22 12:26:10'
UNION
SELECT 'user_2', '2023-10-22 12:26:10'
UNION
SELECT 'user_3', '2023-10-22 12:26:10'
UNION
SELECT 'user_4', '2023-10-22 12:26:10'
UNION
SELECT 'user_1', '2023-10-15 12:26:10'
UNION
SELECT 'user_2', '2023-10-15 12:26:10'
UNION
SELECT 'user_3', '2023-10-15 12:26:10'
UNION
SELECT 'user_4', '2023-10-15 12:26:10'
UNION
SELECT 'user_5', '2023-10-15 12:26:10'
UNION
SELECT 'user_1', '2023-09-29 12:26:10'
UNION
SELECT 'user_2', '2023-09-29 12:26:10'
UNION
SELECT 'user_3', '2023-09-29 12:26:10'
UNION
SELECT 'user_4', '2023-09-29 12:26:10'
UNION
SELECT 'user_5', '2023-09-29 12:26:10'
UNION
SELECT 'user_6', '2023-09-29 12:26:10'
UNION
SELECT 'user_1', '2023-07-31 12:26:10'
UNION
SELECT 'user_2', '2023-07-31 12:26:10'
UNION
SELECT 'user_3', '2023-07-31 12:26:10'
UNION
SELECT 'user_4', '2023-07-31 12:26:10'
UNION
SELECT 'user_5', '2023-07-31 12:26:10'
UNION
SELECT 'user_6', '2023-07-31 12:26:10'
UNION
SELECT 'user_7', '2023-07-31 12:26:10'
;

计算

SELECT
    log_day,
    count(user_id_day0) AS login_user_cnt,
    count(user_id_day1)/count(user_id_day0) AS day1_rate,
    count(user_id_day3)/count(user_id_day0) AS day3_rate,
    count(user_id_day7)/count(user_id_day0) AS day7_rate,
    count(user_id_day14)/count(user_id_day0) AS day14_rate,
    count(user_id_day30)/count(user_id_day0) AS day30_rate,
    count(user_id_day90)/count(user_id_day0) AS day90_rate
FROM
    (
    SELECT 
        log_day,
        a.user_id_day0,
        b.user_id AS user_id_day1,
        c.user_id AS user_id_day3,
        d.user_id AS user_id_day7,
        e.user_id AS user_id_day14,
        f.user_id AS user_id_day30,
        g.user_id AS user_id_day90
    FROM
        ( SELECT  
                TO_DATE(login_time) AS log_day, 
                user_id AS user_id_day0 
                FROM 
                t_user_login 
                GROUP BY 
                user_id,
                TO_DATE(login_time)
                ) a
        LEFT JOIN t_user_login b ON DATEDIFF( TO_DATE( b.login_time ), a.log_day ) = 1 
        AND a.user_id_day0 = b.user_id
        LEFT JOIN t_user_login c ON DATEDIFF( TO_DATE( c.login_time ), a.log_day ) = 2 
        AND a.user_id_day0 = c.user_id
        LEFT JOIN t_user_login d ON datediff( TO_DATE( d.login_time ), a.log_day ) = 6 
        AND a.user_id_day0 = d.user_id
        LEFT JOIN t_user_login e ON datediff( TO_DATE( e.login_time ), a.log_day ) = 13 
        AND a.user_id_day0 = e.user_id 
        LEFT JOIN t_user_login f ON datediff( TO_DATE( f.login_time ), a.log_day ) = 29 
        AND a.user_id_day0 = f.user_id 
        LEFT JOIN t_user_login g ON datediff( TO_DATE( g.login_time ), a.log_day ) = 89 
        AND a.user_id_day0 = g.user_id 
    ) temp 
GROUP BY
    log_day
ORDER BY 
    log_day
;

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

话数Science

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值