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;