select count(b.date2)/count(a.date) as avg_ret
from(
select distinct device_id,date
from question_practice_detail )a
left join
(select distinct device_id ,date_format(date+1,'%Y-%m-%d')as date2
from question_practice_detail)b
on a.device_id =b.device_id and a.date=b.date2
首先说一下我对该题的解题思路,该题就是找分子和分母的值做除法就行了。分母的话就是对device_id和date分组去重的一个总和,由于开始想的是用窗口函数排序,过程稍微有点繁琐,后来发现直接distinct就可以得到。 然后就是对比日期来确定分子,刚开始我想用date+1来匹配question_practice_detail中的日期然后进行计数,发现这样的方法只会得到null。所以就想到用来两张表进行匹配,这样date+1如果和date对比上就说明次日留存数就加1。所以用两张表进行联结来确定分子,这里必须用where筛选加上条件为同一个device_id。注意这里用到的是一个左联结,这样就可以保证左边的是分母,两者共同的为分子。