select round(count(distinct t1.device_id,t1.date)/count(distinct t.device_id,t.date),4) as avg_ret from question_practice_detail t left join question_practice_detail t1 on t.device_id = t1.device_id and datediff(t1.date,t.date)=1
这个题看题目是次日留存的,其实本质是考察表的自联结的。
但易错的点不在这里。
作为老手,第一时间想到的就是自联结。
然后 思路就是使用第二天来的人/除以第一天来的人即可
然后写了count(distint t1.device_id)/count(distint t.device_id)
这么写是因为没有第二天的数据,不会左联到T表,就为null,count(列)
是统计非null的行数。但是这个结果不对。
然后把数据导入到本地调试一下,然后明白了代表一个用户一天的情况,需要把天也加进来,device_id+date
才能标识唯一。
然后就求出正确的答案了。
count本身不能求多列,但是加入了distinct 就把多列变为一个组了,就可以了。
本题重点
- 1、使用自联结:表自己与自己链接
- 2、明白count用法
- count(列) 统计非null行数
- count(多列不行) count(distinct 多列可以)
- 3、datediff的用法:前面的日期 - 后面的日期。单位是天。【mysql】用法