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
- 整体查询:从子查询
id_last_next_date
中选取数据,计算date2
的数量除以date1
的数量,命名为avg_ret
。 - 子查询
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) 。