题解 | #统计活跃间隔对用户分级结果#

统计活跃间隔对用户分级结果

https://www.nowcoder.com/practice/6765b4a4f260455bae513a60b6eed0af

-- 步骤 1:查找每个用户的最早日志记录
WITH tmp_fst AS (
    SELECT
        uid,
        MIN(in_time) AS in_time
    FROM
        tb_user_log
    GROUP BY
        uid
),

-- 步骤 2:查找具有多个日志记录的用户的最新日志记录
tmp_non_lst AS (
    SELECT
        uid,
        MAX(in_time) AS in_time
    FROM
        tb_user_log
    GROUP BY
        uid
    HAVING
        MAX(in_time) <> MIN(in_time)
),

-- 步骤 3:根据日期差异计算用户等级
result_tmp AS (
    SELECT
        CASE
            -- "流失用户":最后一次日志记录至少在 29 天前的用户
            WHEN DATEDIFF(c.today, COALESCE(b.in_time, a.in_time)) >= 29 THEN "流失用户"
            -- "沉睡用户":最后一次日志记录至少在 6 天前但不超过 29 天的用户
            WHEN DATEDIFF(c.today, COALESCE(b.in_time, a.in_time)) >= 6 THEN "沉睡用户"
            -- "新晋用户":首次日志记录在过去 6 天内的用户
            WHEN DATEDIFF(c.today, a.in_time) <= 6 THEN "新晋用户"
            -- "忠实用户":最后一次日志记录在过去 6 天内且至少有一条之前的记录的用户
            WHEN DATEDIFF(c.today, b.in_time) <= 6 AND b.in_time IS NOT NULL THEN "忠实用户"
        END AS user_grade
    FROM
        tmp_fst a
    LEFT JOIN
        tmp_non_lst b ON a.uid = b.uid
    JOIN
        (SELECT MAX(in_time) AS today FROM tb_user_log) c ON 1 = 1
)

-- 步骤 4:计算每个用户等级的比例
SELECT
    t1.user_grade,
    t1.ratio
FROM
    (
    SELECT
        t.user_grade,
        ROUND(COUNT(t.user_grade) OVER (PARTITION BY t.user_grade ORDER BY t.user_grade) / COUNT(t.user_grade) OVER (), 2) AS ratio
    FROM
        result_tmp t
    ) t1
GROUP BY
    t1.user_grade,
    t1.ratio;

全部评论

相关推荐

投递拓竹科技等公司10个岗位
点赞 评论 收藏
分享
07-25 10:17
仰恩大学 营销
bg双非,被挂了
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
06-12 16:00
天津大学 Java
牛客30236098...:腾讯坏事做尽,终面挂是最破防的 上次被挂了后我连简历都不刷了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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