首页 > 试题广场 >

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

[编程题]统计活跃间隔对用户分级结果
  • 热度指数:57376 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

用户行为日志表tb_user_log

id uid artical_id in_time out_time sign_cin
1 109 9001 2021-08-31 10:00:00 2021-08-31 10:00:09 0
2 109 9002
2021-11-04 11:00:55 2021-11-04 11:00:59 0
3 108 9001
2021-09-01 10:00:01 2021-09-01 10:01:50 0
4 108 9001
2021-11-03 10:00:01
2021-11-03 10:01:50 0
5 104 9001
2021-11-02 10:00:28 2021-11-02 10:00:50
0
6
104 9003 2021-09-03 11:00:45
2021-09-03 11:00:55
0
7 105 9003 2021-11-03 11:00:53
2021-11-03 11:00:59
0
8
102 9001 2021-10-30 10:00:00
2021-10-30 10:00:09
0
9
103 9001 2021-10-21 10:00:00
2021-10-21 10:00:09
0
10 101 0 2021-10-01 10:00:00
2021-10-01 10:00:42
1
(uid-用户ID, artical_id-文章ID, in_time-进入时间, out_time-离开时间, sign_in-是否签到)

问题:统计活跃间隔对用户分级后,各活跃等级用户占比,结果保留两位小数,且按占比降序排序

  • 用户等级标准简化为:忠实用户(近7天活跃过且非新晋用户)、新晋用户(近7天新增)、沉睡用户(近7天未活跃但更早前活跃过)、流失用户(近30天未活跃但更早前活跃过)。
  • 假设就是数据中所有日期的最大值。
  • 近7天表示包含当天T的近7天,即闭区间[T-6, T]。

输出示例
示例数据的输出结果如下

user_grade ratio
忠实用户 0.43
新晋用户 0.29
沉睡用户 0.14
流失用户 0.14

解释:
今天日期为2021.11.04,根据用户分级标准,用户行为日志表tb_user_log忠实用户有:109、108、104;新晋用户有105、102;沉睡用户有103;流失用户有101;共7个用户,因此他们的比例分别为0.43、0.29、0.14、0.14。
示例1

输入

DROP TABLE IF EXISTS tb_user_log;
CREATE TABLE tb_user_log (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid INT NOT NULL COMMENT '用户ID',
    artical_id INT NOT NULL COMMENT '视频ID',
    in_time datetime COMMENT '进入时间',
    out_time datetime COMMENT '离开时间',
    sign_in TINYINT DEFAULT 0 COMMENT '是否签到'
) CHARACTER SET utf8 COLLATE utf8_bin;

INSERT INTO tb_user_log(uid, artical_id, in_time, out_time, sign_in) VALUES
  (109, 9001, '2021-08-31 10:00:00', '2021-08-31 10:00:09', 0),
  (109, 9002, '2021-11-04 11:00:55', '2021-11-04 11:00:59', 0),
  (108, 9001, '2021-09-01 10:00:01', '2021-09-01 10:01:50', 0),
  (108, 9001, '2021-11-03 10:00:01', '2021-11-03 10:01:50', 0),
  (104, 9001, '2021-11-02 10:00:28', '2021-11-02 10:00:50', 0),
  (104, 9003, '2021-09-03 11:00:45', '2021-09-03 11:00:55', 0),
  (105, 9003, '2021-11-03 11:00:53', '2021-11-03 11:00:59', 0),
  (102, 9001, '2021-10-30 10:00:00', '2021-10-30 10:00:09', 0),
  (103, 9001, '2021-10-21 10:00:00', '2021-10-21 10:00:09', 0),
  (101, 0, '2021-10-01 10:00:00', '2021-10-01 10:00:42', 1);

输出

忠实用户|0.43
新晋用户|0.29
沉睡用户|0.14
流失用户|0.14
头像 webary
发表于 2021-12-03 22:44:17
统计活跃间隔对用户分级结果 明确题意: 统计活跃间隔对用户分级后,各活跃等级用户占比,结果保留两位小数,且按占比降序排序 问题分解: 计算每个用户最早最晚活跃日期(作为子表t_uid_first_last): 按用户ID分组:GROUP BY uid 统计最早活跃:MIN(DATE(in_t 展开全文
头像 不爱data爱dating的屁屁酱
发表于 2022-03-03 20:10:28
思路: 我的思路是通过“今日与最晚活跃日期时间差”和“今日与最早活跃日期时间差”共同来确定用户的等级,所以首先生成一个表a,主要包含三个字段:uid,今日与最晚活跃日期时间差,今日与最早活跃日期时间差: select uid, datediff((select max(out_time 展开全文
头像 盐咸咸
发表于 2022-03-25 15:37:34
只要理解清楚题目的含义,11行代码就能搞定啦~ 一、题目理解 把用户分成4个等级,并分别统计各个等级的用户占总用户的比,结果按照占比降序排列。4个等级的划分规则如下: 忠实用户(近7天活跃过且非新晋用户) 新晋用户(近7天新增) 沉 展开全文
头像 通辽可汗克鸽勃
发表于 2021-12-14 13:07:46
代码又臭又长,用了很多次子查询,感觉很不聪明的样子,基本思路是如下 1:判断是不是找出最后一次登录时间差 2:是不是新顾客 3:标签分组 4:统计 select grade ,round( count(*)/(select count(distinct uid) from tb_user_ 展开全文
头像 BLAcKSQAoO
发表于 2021-12-02 18:53:44
日期比较搞。。。 总结: 凡是统计第n天内的问题,要求包含当天,利用DATE_SUB前推日期时要用【T- (n-1)】 例子: 要求统计近7天内,区间为【当天前推6天,当天】 要求统计近14天内,区间为【当天前推13天,当天】 要求统计近30天内,区间为【当天前推29天,当天】 ... 代码如下: 展开全文
头像 玉树叶
发表于 2021-12-20 15:13:31
通过代码 select user_grade, round(count(uid) / tot,2) ratio from (select uid, tot, (case when datediff(now,intime) > 6 and date 展开全文
头像 风雪行
发表于 2022-07-25 11:55:03
代码挺长的, 具体我一段段说明一下 子查询1: 注意: 需要尽量避免在select ( ) from table1括号中嵌套子查询, 因为外层表table1中, 每有一行, 都会执行一次内部的子查询, 这里有两种解决办法, 一种是用with as 提前将max(out_time) 保存为变量, 然 展开全文
头像 求求给个offer吧好吗
发表于 2022-02-06 23:52:07
用了个很笨的方法 union all select user_grade,round(count(uid)/(SELECT COUNT(DISTINCT uid) FROM tb_user_log),2) radio from (-- 忠实用户(近7天活跃过且非新晋用户) select disti 展开全文
头像 酸菜鱼土豆大侠
发表于 2022-11-21 10:55:38
【场景】:近几天活跃 【分类】:条件函数、日期函数、datediff 分析思路 难点: 1.这个题有一个坑题目中没有说清楚,沉睡用户(近7天未活跃但更早前活跃过),根据定义它是包含流失用户(近30天未活跃但更早前活跃过),也就是说只要是流失用户就是沉睡用户!实际上答案并不包括。所以沉睡用户应该这样 展开全文
头像 立耳兔Dev
发表于 2022-08-18 11:05:55
明确思路: 划分依据有两个 1. 活跃间隔,可以等价于最后一次活跃到今天的差距; 2. 是否新晋用户,可以等价于第一次活跃到今天的差距 提及的三个时间为 1. 最后一次活跃,max(out_time) group by uid 2. 第一次活跃,min(in_ti 展开全文

问题信息

难度:
253条回答 1437浏览

热门推荐

通过挑战的用户

查看代码
  • 二维码

    扫描二维码,关注牛客网

  • 二维码

    下载牛客APP,随时随地刷题