业务端需要求连续90日每日的用户留存率改怎么计算呢???
一: 本文采用MySQL8.0环境- 1: 建表数据
- CREATE TABLE `user_login` (
- `user_id` int NOT NULL,
- `login_date` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8; MySQL8.0 或者 hive 执行<br><br><br>表里的数据如下:
复制代码 user_id login_date
"1001" "2021-12-12"
"1002" "2021-12-12"
"1001" "2021-12-13"
"1001" "2021-12-14"
"1001" "2021-12-16"
"1002" "2021-12-16"
"1001" "2021-12-19"
"1002" "2021-12-17"
"1001" "2021-12-20"
"1002" "2021-12-14"
"1002" "2021-12-20"
"1003" "2021-12-12"
"1004" "2021-12-18"
"1005" "2021-12-20"
"1006" "2021-12-14"
"1007" "2021-12-14"
"1007" "2021-12-19"
二:执行SQL
[code] select a.login_date 日期, datediff(b.login_date , a.login_date) as days, count(distinct if(datediff(a.login_date , a.login_date_min) = 0 ,a.user_id,null)) as 注册用户数,count(distinct if(datediff(b.login_date , a.login_date) != 0 ,if(datediff(b.login_date , a.login_date) != 0 and a.user_id = b.user_id, b.user_id,null),if(datediff(a.login_date , a.login_date_min) = 0 ,a.user_id,null))) as days日留存用户数from (selectuser_id,login_date,case when rn =1 then login_date else null end login_date_minfrom(selectuser_id,login_date,row_number() over(partition by user_id order by login_date) rnfromuser_login) tmp) aleft join user_login b on b.login_date >=a.login_date and datediff(b.login_date ,a.login_date) |