select 
    count(date2)/count(date1) as avg_ret
from(
    select
        distinct qpd.device_id,
        qpd.date as date1,
        uniq_id_date.date as date2
    from question_practice_detail as qpd
    left join(
        select distinct device_id,date
        from question_practice_detail
    )as uniq_id_date
    on qpd.device_id=uniq_id_date.device_id
        and date_add(qpd.date,interval 1 day)=uniq_id_date.date
)as id_last_next_date
  1. 整体查询:从子查询id_last_next_date中选取数据,计算date2的数量除以date1的数量,命名为avg_ret
  2. 子查询id_last_next_date:从question_practice_detail表(别名qpd)与另一个子查询uniq_id_date进行左连接。uniq_id_date子查询:从question_practice_detail表中选取不同的device_id和date。主连接条件:qpd.device_id等于uniq_id_date.device_id,并且qpd.date的下一天等于uniq_id_date.date 。最终结果集:包含不同的device_id,qpd表中的date(命名为date1)以及uniq_id_date中的date(命名为date2) 。