题解 | #每天的日活数及新用户占比#
https://www.nowcoder.com/practice/dbbc9b03794a48f6b34f1131b1a903eb
本题难点:当in_time和out_time跨天时,应该如何处理?
本人的做法是将in_time和out_time 使用union操作,合并在一起,
由于union操作会去重,所以union后的结果直接使用就可以,不用去重。
相应的sql如下:
SELECT uid, DATE_FORMAT(in_time, '%Y-%m-%d') in_time FROM tb_user_log UNION SELECT uid, DATE_FORMAT(out_time, '%Y-%m-%d') in_time FROM tb_user_log
接下来只要按照题意正确写出sql即可,
SELECT in_time, COUNT(uid) dau, ROUND(SUM(IF(in_time = DATE_FORMAT(min_time,'%Y-%m-%d'),1,0)) / COUNT(uid),2) uv_new_ratio FROM( SELECT *, MIN(in_time) OVER(PARTITION BY uid) min_time FROM( SELECT uid, DATE_FORMAT(in_time, '%Y-%m-%d') in_time FROM tb_user_log UNION SELECT uid, DATE_FORMAT(out_time, '%Y-%m-%d') in_time FROM tb_user_log )tmp1 )tmp2 GROUP BY in_time ORDER BY in_time;

