# 思路:将表视为第一天的刷题表,将同样的表进行表连接筛选出第二天的登入信息。

-- 定义第一个公共表表达式(CTE),选择 question_practice_detail 表中所有不同的 device_id 和 date
with t1 as
(
    select distinct device_id, date
    from question_practice_detail
),
-- 定义第二个公共表表达式(CTE),选择 question_practice_detail 表中所有不同的 device_id 和 date
t2 as
(
    select distinct device_id, date
    from question_practice_detail
)

-- 计算 t2 中的日期数与 t1 中的日期数的比值,如果结果为 NULL,则返回 0
select coalesce(count(t2.date) / count(t1.date), 0) as avg_ret
from t1
-- 使用 LEFT JOIN 将 t1 和 t2 连接在一起,连接条件是 device_id 相同且 t1 的日期加一天等于 t2 的日期
left join t2 on t1.device_id = t2.device_id and date_add(t1.date, interval 1 day) = t2.date;