SELECT AVG(IF(b.device_id IS NOT NULL,1,0)) AS avg_ret
FROM (
    SELECT DISTINCT device_id,`date`-- 可能一个人同一天刷了不止一道题
    FROM question_practice_detail
)a LEFT JOIN (-- 使用左联结
    SELECT DISTINCT device_id,DATE_SUB(date, INTERVAL 1 DAY) AS `date`
    FROM question_practice_detail
)b ON a.device_id = b.device_id AND a.date = b.date-- 这里的联接条件是两个,只要有一个不符合全部都是NUll