SQL面试题练习 —— 共同使用ip用户检测问题

目录

  • [1 题目](#1 题目)
  • [2 建表语句](#2 建表语句)
  • [3 题解](#3 题解)

题目来源:字节跳动。

1 题目

现有用户登录日志表,记录了每个用户登录的IP地址,请查询共同使用过3个及以上IP的用户对;

样例数据

复制代码
+----------+-----------------+----------------------+
| user_id  |       ip        |      time_stamp      |
+----------+-----------------+----------------------+
| 2        | 223.104.41.101  | 2023-08-24 07:00:00  |
| 4        | 223.104.41.122  | 2023-08-24 10:00:00  |
| 5        | 223.104.41.126  | 2023-08-24 11:00:00  |
| 4        | 223.104.41.126  | 2023-08-24 13:00:00  |
| 1        | 223.104.41.101  | 2023-08-24 16:00:00  |
| 3        | 223.104.41.101  | 2023-08-24 16:02:00  |
| 2        | 223.104.41.104  | 2023-08-24 16:30:00  |
| 1        | 223.104.41.121  | 2023-08-24 17:00:00  |
| 2        | 223.104.41.122  | 2023-08-24 17:05:00  |
| 3        | 223.104.41.103  | 2023-08-24 18:11:00  |
| 2        | 223.104.41.103  | 2023-08-24 19:00:00  |
| 1        | 223.104.41.104  | 2023-08-24 19:00:00  |
| 3        | 223.104.41.122  | 2023-08-24 19:07:00  |
| 1        | 223.104.41.122  | 2023-08-24 21:00:00  |
+----------+-----------------+----------------------+

2 建表语句

sql 复制代码
--建表语句
CREATE TABLE t_login_log (
user_id bigint COMMENT '用户ID',
ip string COMMENT '用户登录ip地址',
time_stamp string COMMENT '登录时间'
) COMMENT '用户登录记录表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
;
-- 插入数据
insert into t_login_log(user_id,ip,time_stamp)
values
(1,'223.104.41.101','2023-08-24 16:00:00'),
(1,'223.104.41.121','2023-08-24 17:00:00'),
(1,'223.104.41.104','2023-08-24 19:00:00'),
(1,'223.104.41.122','2023-08-24 21:00:00'),
(1,'223.104.41.122','2023-08-24 22:00:00'),
(2,'223.104.41.101','2023-08-24 07:00:00'),
(2,'223.104.41.103','2023-08-24 19:00:00'),
(2,'223.104.41.104','2023-08-24 16:30:00'),
(2,'223.104.41.122','2023-08-24 17:05:00'),
(3,'223.104.41.103','2023-08-24 18:11:00'),
(3,'223.104.41.122','2023-08-24 19:07:00'),
(3,'223.104.41.101','2023-08-24 16:02:00'),
(4,'223.104.41.126','2023-08-24 13:00:00'),
(5,'223.104.41.126','2023-08-24 11:00:00'),
(4,'223.104.41.122','2023-08-24 10:00:00');

3 题解

(1)将所有用户登录记录按照用户ID和登录IP去重

sql 复制代码
select user_id,
       ip
from t_login_log
group by user_id, ip

执行结果

复制代码
+----------+-----------------+
| user_id  |       ip        |
+----------+-----------------+
| 1        | 223.104.41.101  |
| 1        | 223.104.41.104  |
| 1        | 223.104.41.121  |
| 1        | 223.104.41.122  |
| 2        | 223.104.41.101  |
| 2        | 223.104.41.103  |
| 2        | 223.104.41.104  |
| 2        | 223.104.41.122  |
| 3        | 223.104.41.101  |
| 3        | 223.104.41.103  |
| 3        | 223.104.41.122  |
| 4        | 223.104.41.122  |
| 4        | 223.104.41.126  |
| 5        | 223.104.41.126  |
+----------+-----------------+

(2)通过IP地址进行自关联,去重,剔除相同用户。

sql 复制代码
with tmp as
         (select user_id,
                 ip
          from t_login_log
          group by user_id, ip)
select t1.user_id,
       t2.user_id,
       t1.ip
from tmp as t1
         join
     tmp as t2
     on t1.ip = t2.ip
where t1.user_id < t2.user_id

执行结果

复制代码
+-------------+-------------+-----------------+
| t1.user_id  | t2.user_id  |      t1.ip      |
+-------------+-------------+-----------------+
| 1           | 2           | 223.104.41.101  |
| 1           | 3           | 223.104.41.101  |
| 2           | 3           | 223.104.41.101  |
| 2           | 3           | 223.104.41.103  |
| 1           | 2           | 223.104.41.104  |
| 1           | 2           | 223.104.41.122  |
| 1           | 3           | 223.104.41.122  |
| 1           | 4           | 223.104.41.122  |
| 2           | 3           | 223.104.41.122  |
| 2           | 4           | 223.104.41.122  |
| 3           | 4           | 223.104.41.122  |
| 4           | 5           | 223.104.41.126  |
+-------------+-------------+-----------------+

(3)根据用户组计算使用共同IP的个数

sql 复制代码
with tmp as
         (select user_id,
                 ip
          from t_login_log
          group by user_id, ip)
select t1.user_id,
       t2.user_id,
       count(t1.ip)
from tmp as t1
         join
     tmp as t2
     on t1.ip = t2.ip
where t1.user_id < t2.user_id
group by t1.user_id,
         t2.user_id

执行结果

复制代码
+-------------+-------------+------+
| t1.user_id  | t2.user_id  | _c2  |
+-------------+-------------+------+
| 1           | 2           | 3    |
| 1           | 3           | 2    |
| 1           | 4           | 1    |
| 2           | 3           | 3    |
| 2           | 4           | 1    |
| 3           | 4           | 1    |
| 4           | 5           | 1    |
+-------------+-------------+------+

(4)查询共同使用过3个以上IP的用户对

sql 复制代码
with tmp as
         (select user_id,
                 ip
          from t_login_log
          group by user_id, ip)
select t1.user_id,
       t2.user_id
from tmp as t1
         join
     tmp as t2
     on t1.ip = t2.ip
where t1.user_id < t2.user_id
group by t1.user_id,
         t2.user_id
having count(t1.ip) >= 3

执行结果

复制代码
+-------------+-------------+
| t1.user_id  | t2.user_id  |
+-------------+-------------+
| 1           | 2           |
| 2           | 3           |
+-------------+-------------+
相关推荐
蓦然乍醒1 分钟前
使用 DBeaver 还原 PostgreSQL 备份文件 (.bak) 技术文档
数据库·postgresql
XDHCOM1 分钟前
Redis节点故障自动恢复机制详解,如何快速抢救故障节点,确保数据不丢失?
java·数据库·redis
QCzblack4 分钟前
BugKu BUUCTF ——Reverse
java·前端·数据库
cyber_两只龙宝7 分钟前
【Oracle】Oracle之DQL中WHERE限制条件查询
linux·运维·数据库·云原生·oracle
luis的妙妙屋8 分钟前
主流数据库数据类型对比分析
数据库
XDHCOM25 分钟前
ORA-00054资源忙故障修复,远程处理Oracle报错解决方案,数据库锁超时NOWAIT指定问题排查
数据库·oracle
q210306337235 分钟前
初学Access(具体示例)
数据库
l1t1 小时前
DeepSeek总结的PostgreSQL使用 RDTSC 降低 EXPLAIN ANALYZE 的计时开销
数据库·postgresql
lagrahhn1 小时前
Oracle中各个c版本介绍
数据库·oracle
知识分享小能手2 小时前
MongoDB入门学习教程,从入门到精通,在生产环境中设置MongoDB(21)
数据库·学习·mongodb