select *,
concat(round(100 * 次日留存用戶數/活躍用戶數, 2), '%') 次日留存率,
concat(round(100 * 三日留存用戶數/活躍用戶數, 2), '%') 三日留存率,
concat(round(100 * 七日留存用戶數/活躍用戶數, 2), '%') 七日留存率
from (
select
a.log_day 日期,
count(distinct(concat(a.device_id, a.app_id))) 活躍用戶數,
count(distinct(concat(b.device_id, b.app_id))) 次日留存用戶數,
count(distinct(concat(c.device_id, c.app_id))) 三日留存用戶數,
count(distinct(concat(d.device_id, d.app_id))) 七日留存用戶數
from user_log a
left join user_log b on concat(a.device_id, a.app_id) = concat(b.device_id, b.app_id) and b.log_day = a.log_day + 1
left join user_log c on concat(a.device_id, a.app_id) = concat(c.device_id, c.app_id) and c.log_day = a.log_day + 3
left join user_log d on concat(a.device_id, a.app_id) = concat(d.device_id, d.app_id) and d.log_day = a.log_day + 7
group by a.log_day
) p;