首页 > 试题广场 >

查询连续登陆的用户

[编程题]查询连续登陆的用户
  • 热度指数:55199 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
某产品在2022年2月8日各端口用户注册信息及后几日登录信息如下:

用户注册信息表register_tb(user_id-用户id, reg_time-注册时间, reg_port-注册端口)
user_id reg_time reg_port
1101 2022-02-08 07:23:15 pc
1102 2022-02-08 09:12:22 app
1103 2022-02-08 09:35:45 m
1104 2022-02-08 09:41:01 app
1105 2022-02-08 12:01:01 app
1106 2022-02-08 17:22:13 app
1107 2022-02-08 18:26:21 pc
1108 2022-02-08 19:16:21 pc
1109 2022-02-08 19:56:21 pc

用户登录信息表login_tb(log_id-登录动作id,user_id-用户id, log_time-登录时间,  log_port-登录端口)
log_id user_id log_time log_port
101 1101 2022-02-09 07:24:15 pc
102 1102 2022-02-09 09:12:57 app
103 1003 2022-02-09 09:36:11 m
104 1102 2022-02-10 09:37:01 app
105 1104 2022-02-10 12:01:46 app
106 1106 2022-02-10 10:23:01 app
107 1003 2022-02-10 10:43:01 m
108 1102 2022-02-11 11:56:47 app
109 1104 2022-02-11 14:52:37 app
1010 1106 2022-02-11 16:56:27 app
1011 1003 2022-02-11 17:43:01 m
1012 1106 2022-02-12 10:56:17 app

问题:请查询连续登陆不少于3天的新注册用户要求:输出user_id并升序排序。
注:登录表为单日随机一次登录数据,该题忽略单日多次登录情况。

示例输出如下:
user_id
1102
1106
解释:1102在9日、10日、11日,登陆了系统满足查询条件;1106在10日、11日、12日登录了系统满足查询条件。
示例1

输入

drop table if exists  `register_tb` ; 
CREATE TABLE `register_tb` (
`user_id` int(11) NOT NULL,
`reg_time` datetime NOT NULL,
`reg_port` varchar(8) NOT NULL,
PRIMARY KEY (`user_id`));
INSERT INTO register_tb VALUES(1101,'2022-02-08 07:23:15','pc');
INSERT INTO register_tb VALUES(1102,'2022-02-08 09:12:22','app');
INSERT INTO register_tb VALUES(1103,'2022-02-08 09:35:45','m');
INSERT INTO register_tb VALUES(1104,'2022-02-08 09:41:01','app');
INSERT INTO register_tb VALUES(1105,'2022-02-08 12:01:01','app');
INSERT INTO register_tb VALUES(1106,'2022-02-08 17:22:13','app');
INSERT INTO register_tb VALUES(1107,'2022-02-08 18:26:21','pc');
INSERT INTO register_tb VALUES(1108,'2022-02-08 19:16:21','pc');
INSERT INTO register_tb VALUES(1109,'2022-02-08 19:56:21','pc');

drop table if exists  `login_tb` ;   
CREATE TABLE `login_tb` (
`log_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`log_time` datetime NOT NULL,
`log_port` varchar(8) NOT NULL,
PRIMARY KEY (`log_id`));
INSERT INTO login_tb VALUES(101,1101,'2022-02-09 07:24:15','pc');
INSERT INTO login_tb VALUES(102,1102,'2022-02-09 09:12:57','app');
INSERT INTO login_tb VALUES(103,1003,'2022-02-09 09:36:11','m');
INSERT INTO login_tb VALUES(104,1102,'2022-02-10 09:37:01','app');
INSERT INTO login_tb VALUES(105,1104,'2022-02-10 12:01:46','app');
INSERT INTO login_tb VALUES(106,1106,'2022-02-10 10:23:01','app');
INSERT INTO login_tb VALUES(107,1003,'2022-02-10 10:43:01','m');
INSERT INTO login_tb VALUES(108,1102,'2022-02-11 11:56:47','app');
INSERT INTO login_tb VALUES(109,1104,'2022-02-11 14:52:37','app');
INSERT INTO login_tb VALUES(1010,1106,'2022-02-11 16:56:27','app');
INSERT INTO login_tb VALUES(1011,1003,'2022-02-11 17:43:01','m');
INSERT INTO login_tb VALUES(1012,1106,'2022-02-12 10:56:17','app');

输出

1102
1106
头像 牛客题解官
发表于 2025-02-20 12:05:28
精华题解 1. 确定总体问题 我们需要找出在注册后连续登录不少于3天的用户,并输出他们的用户ID,并按用户ID升序排序。 2. 分析关键问题 提取登录日期:从登录信息中提取每个用户的登录日期。 编号登录记录:为每个用户的登录日期编号,以便识别连续登录的天数。 识别连续登录:通过计算日期差异识别连续登录的天数 展开全文
头像 NancyFeng
发表于 2024-08-10 05:16:56
SELECT user_id FROM ( SELECT user_id ,DATE(log_time) AS log_date ,LEAD(DATE(log_time), 1) OVER(PARTITION BY user_id ORDER BY log_ 展开全文
头像 牛客638046884号
发表于 2024-08-14 20:44:56
select user_id from ( select user_id, date_sub(log_time,interval rk day) as diff from ( select user_id, date(log_time) as log_time, row_number()over( 展开全文
头像 小田是我
发表于 2024-09-05 22:50:47
select a.user_id from login_tb as a inner join login_tb as b on a.user_id = b.user_id and date(a.log_time)=date(b.log_time)-1 #自联结,条件是某一用户存在第二天的登录记录 展开全文
头像 灿灿灿灿灿_
发表于 2024-10-13 17:19:16
-- 使用窗口函数解决连续求解问题 SELECT user_id FROM (SELECT *, -- 若两行记录登录时间与序号相减是是相同值,则证明这两行时连续登录 DATE_SUB(DATE(log_time), INTERVAL ranking DAY) AS dt FROM 展开全文
头像 拒绝996的小蜗牛很自信
发表于 2024-08-09 21:26:04
select user_id from register_tb where user_id in (select tb1.user_id from login_tb as tb1 join (select user_id,log_time from login_tb) as tb2 on tb 展开全文
头像 Tangxiaoya
发表于 2024-08-24 19:49:24
select user_id from ( select user_id , count(date_sub(date_1,interval rn day)) num from ( select a.user_id , date(log_time) d 展开全文
头像 我也没事🙂
发表于 2024-08-21 13:37:48
select c.user_id from (select a.user_id,count(distinct log_time) cou from register_tb a inner join login_tb b on a.user_id=b.user_id group by b.user_ 展开全文
头像 在努力的安哥拉兔很热爱生活
发表于 2024-08-14 14:31:46
with t1 as ( select user_id,date(log_time) log_time,row_number()over(partition by user_id order by date(log_time)) as rk from login_tb gro 展开全文
头像 Banana1223
发表于 2025-05-09 16:59:57
select a.user_id from ( select a.user_id, STR_TO_DATE(left(a.log_time,10), '%Y-%m-%d') as log_day, DATE_ADD(STR_TO_DATE(LEFT(a.log_time,10), '%Y-%m-%d 展开全文
头像 数据分析仔
发表于 2025-02-18 13:33:02
select user_id from (select *,date_sub(time,interval cum day) as base_time from (select *,row_number() over(partition by a.user_id order by a.time 展开全文