题解 | #每天的日活数及新用户占比#

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;



全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务