欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[面试SQL试题]查询出在半个小时内通话多次(2次及以上)的用户id

程序员文章站 2022-05-14 21:21:11
...

这是最近一次面试,遇到的试题之一。后来开机对该题做了复现,记录如下。

有一张记录了用户通话时间的表records,共三个字段:call_day,call_time, user_id,分别为通话日期,通话时间,用户id。
写出SQL语句,查询出在半个小时内通话多次(2次及以上)的用户id。

字段 类型
call_day (通话日期) date
call_time (通话时间) time
user_id(用户id) int

1、在MySQL创建表records

CREATE TABLE records
(
call_day 	date 	NOT NULL,
call_time 	time 	NOT NULL,
user_id 	int 	NOT NULL
);

2、插入数据

INSERT INTO records VALUES('2020-2-13', '11:24:23', 2234);
INSERT INTO records VALUES('2020-2-13', '13:26:23', 2235);
INSERT INTO records VALUES('2020-2-13', '11:14:24', 2263);
INSERT INTO records VALUES('2020-2-13', '11:44:24', 2263);
INSERT INTO records VALUES('2020-2-13', '11:25:23', 2263);
INSERT INTO records VALUES('2020-2-14', '12:32:23', 2236);
INSERT INTO records VALUES('2020-2-14', '10:42:23', 2237);
INSERT INTO records VALUES('2020-2-14', '11:52:23', 2293);
INSERT INTO records VALUES('2020-2-15', '12:26:23', 2283);
INSERT INTO records VALUES('2020-2-16', '14:32:23', 2633);
INSERT INTO records VALUES('2020-2-17', '14:23:23', 2243);
INSERT INTO records VALUES('2020-2-17', '14:27:23', 2263);
INSERT INTO records VALUES('2020-2-17', '13:29:23', 2633);
INSERT INTO records VALUES('2020-2-17', '17:24:23', 2833);
INSERT INTO records VALUES('2020-2-18', '10:25:23', 2563);
INSERT INTO records VALUES('2020-2-18', '18:42:23', 2893);
INSERT INTO records VALUES('2020-2-18', '18:44:24', 2893);
INSERT INTO records VALUES('2020-2-20', '10:26:23', 2233);
INSERT INTO records VALUES('2020-2-20', '10:12:45', 2233);
INSERT INTO records VALUES('2020-2-20', '10:43:51', 2233);
INSERT INTO records VALUES('2020-2-21', '11:22:23', 2232);
INSERT INTO records VALUES('2020-2-21', '11:32:23', 2232);
INSERT INTO records VALUES('2020-2-21', '11:12:23', 2232);

3、自连接

SELECT 	a.call_day, 
		a.user_id, 
		a.call_time as t1, 
		b.call_time as t2
FROM records a LEFT JOIN records b
ON a.call_day = b.call_day AND a.user_id = b.user_id
WHERE a.call_time > b.call_time;

4、计算时间差

SELECT	a.call_day, 
		a.user_id, 
		a.call_time as t1, 
		b.call_time as t2,
		(a.call_time - b.call_time) AS t1_t2
FROM records a LEFT JOIN records b
ON a.call_day = b.call_day AND a.user_id = b.user_id
WHERE a.call_time > b.call_time;

5、查询半小时内的记录

SELECT	a.call_day, 
		a.user_id, 
		a.call_time as t1, 
		b.call_time as t2,
		(a.call_time - b.call_time) AS t1_t2
FROM records a LEFT JOIN records b
ON a.call_day = b.call_day AND a.user_id = b.user_id
WHERE (a.call_time - b.call_time) > 0 AND (a.call_time - b.call_time) < 3000;
相关标签: mysql