select
sum(if(datediff(t1.next_date,t1.first_date) = 1,1,0)) / count(*) avg_ret
from(
    select
    device_id
    ,`date` first_date
    ,lead(date,1,null)over(partition by device_id order by date asc) next_date
    from (
        select device_id,`date`
        from question_practice_detail
        group by device_id,`date`
    ) tt
)t1
  1. 去重
  2. 计算第二天还在的 / 第一天的人