环境
阿里云,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
;