最蠢的方法 | #统计活跃间隔对用户分级结果#

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

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

WITH a AS(
    SELECT uid, in_time, ROW_NUMBER() OVER (PARTITION BY uid ORDER BY in_time DESC) AS rn, ROW_NUMBER() OVER (PARTITION BY uid ORDER BY in_time) AS rn2 FROM tb_user_log GROUP BY uid, in_time
),

b AS (SELECT uid, in_time FROM a WHERE rn = 1 AND in_time BETWEEN DATE_SUB((SELECT MAX(in_time) FROM tb_user_log), INTERVAL 6 DAY) AND (SELECT MAX(in_time) FROM tb_user_log) AND uid NOT IN (SELECT uid FROM a GROUP BY uid HAVING COUNT(rn) = 1) GROUP BY uid, in_time ), #7天内活跃但非新晋

c AS (SELECT uid, in_time FROM a WHERE rn = 1 AND in_time BETWEEN DATE_SUB((SELECT MAX(in_time) FROM tb_user_log), INTERVAL 6 DAY) AND (SELECT MAX(in_time) FROM tb_user_log) AND uid NOT IN (SELECT uid FROM b)), #7天内新晋

d AS (SELECT uid, in_time FROM a WHERE rn2 = 1 AND in_time BETWEEN DATE_SUB((SELECT MAX(in_time) FROM tb_user_log), INTERVAL 29 DAY) AND DATE_SUB((SELECT MAX(in_time) FROM tb_user_log), INTERVAL 6 DAY) GROUP BY uid, in_time),

e AS (SELECT uid, in_time FROM a WHERE rn = 1 AND in_time < DATE_SUB((SELECT MAX(in_time) FROM tb_user_log), INTERVAL 29 DAY) GROUP BY uid, in_time)

SELECT '忠实用户' AS user_grade, ROUND(COUNT(DISTINCT uid)/(SELECT COUNT(DISTINCT uid) FROM tb_user_log),2) AS ratio FROM b
UNION 
SELECT '新晋用户' AS user_grade, ROUND(COUNT(DISTINCT uid)/(SELECT COUNT(DISTINCT uid) FROM tb_user_log),2) AS ratio FROM c
UNION
SELECT '沉睡用户' AS user_grade, ROUND(COUNT(DISTINCT uid)/(SELECT COUNT(DISTINCT uid) FROM tb_user_log),2) AS ratio FROM d
UNION
SELECT '流失用户' AS user_grade, ROUND(COUNT(DISTINCT uid)/(SELECT COUNT(DISTINCT uid) FROM tb_user_log),2) AS ratio FROM e

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-25 17:22
点赞 评论 收藏
分享
认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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