因为同一个用户在某一个日期可能多次做题,所以需要对原表中的数据通过device_id和date字段进行去重,得到一个新的表t1。这个表的行数count(device_id)就是所有用户不同日期不重复的刷题记录,再与自己进行左连接,连接条件是device_id相同,t1表的日期等于t2表日期的后一天,如果join成功记录下来的t2.date就说明第二天该用户又刷题了,所以count(t2.date) / count(t1.device_id)为最终结果

select
    count(t2.date) / count(t1.device_id) as avg_ret
from 
    (
    select
       distinct device_id,date
    from
        question_practice_detail)as t1
left join
    (
    select
       distinct device_id,date
    from
        question_practice_detail)as t2
on
    t1.device_id = t2.device_id and t1.date = date_add(t2.date,interval 1 day)
;