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           |
+-------------+-------------+
相关推荐
zzzzzz3109 小时前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
倔强的石头_2 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横2 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence3 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神3 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据4 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡4 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧4 天前
Oracle EXPLAIN PLAN
数据库·oracle