如何编写SQL查询同ID同类型且创建时间间隔小于3分钟的记录
符合要求的SQL查询实现
核心思路
- 按
ID和TYPE分组,对同组内的记录按CREATED_TIME排序 - 计算同组内相邻两条记录的时间间隔
- 筛选出存在至少一组间隔小于3分钟的
ID,去重后返回结果
推荐方案(窗口函数实现,性能更优)
以下为通用写法,时间差计算部分可根据你使用的数据库做对应调整:
SELECT DISTINCT ID FROM ( SELECT ID, TYPE, CREATED_TIME, -- 取同ID、同TYPE分组内上一条记录的创建时间 LAG(CREATED_TIME) OVER (PARTITION BY ID, TYPE ORDER BY CREATED_TIME) AS prev_time FROM 你的实际表名 ) temp WHERE prev_time IS NOT NULL -- 以下时间差判断根据数据库类型替换 AND TIMESTAMPDIFF(MINUTE, prev_time, CREATED_TIME) < 3;
不同数据库的时间差语法适配:
- MySQL:保持上面的
TIMESTAMPDIFF写法即可 - PostgreSQL:替换为
EXTRACT(EPOCH FROM (CREATED_TIME - prev_time)) / 60 < 3 - SQL Server:替换为
DATEDIFF(MINUTE, prev_time, CREATED_TIME) < 3 - Oracle:替换为
(CREATED_TIME - prev_time) * 24 * 60 < 3
兼容方案(自连接实现,适配不支持窗口函数的数据库)
SELECT DISTINCT t1.ID FROM 你的实际表名 t1 INNER JOIN 你的实际表名 t2 ON t1.ID = t2.ID AND t1.TYPE = t2.TYPE AND t1.CREATED_TIME < t2.CREATED_TIME -- 时间差判断同样根据数据库类型适配 WHERE TIMESTAMPDIFF(MINUTE, t1.CREATED_TIME, t2.CREATED_TIME) < 3;
内容的提问来源于stack exchange,提问作者yunus_rouhan
相关产品推荐
相关产品推荐

