因为同一个用户在某一个日期可能多次做题,所以需要对原表中的数据通过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)
;