基于MySQL查询10分钟内存在连续交易的用户
找出存在间隔小于10分钟连续交易的用户(MySQL实现)
我来帮你搞定这个需求——从给定的交易表中筛选出那些有连续交易间隔小于10分钟的用户。下面提供两种适配不同MySQL版本的方案:
方案一:使用窗口函数(MySQL 8.0+ 推荐)
如果你的MySQL版本是8.0及以上,窗口函数是最简洁高效的实现方式。我们可以用LAG()函数获取每个用户上一笔交易的时间,然后计算时间差筛选符合条件的记录:
WITH user_transaction_sequence AS ( SELECT user_id, create_time, -- 按用户分组、交易时间排序,获取上一笔交易的时间 LAG(create_time) OVER (PARTITION BY user_id ORDER BY create_time) AS previous_transaction_time FROM transactions ) -- 去重得到符合条件的用户ID SELECT DISTINCT user_id FROM user_transaction_sequence WHERE -- 计算两次交易的分钟差,小于10分钟 TIMESTAMPDIFF(MINUTE, previous_transaction_time, create_time) < 10 -- 排除每个用户的第一笔交易(没有上一笔记录的情况) AND previous_transaction_time IS NOT NULL;
代码说明:
- 先用CTE(公共表表达式)给每个用户的交易按时间排序,同时关联上一笔交易的时间;
- 通过
TIMESTAMPDIFF()函数计算两次交易的分钟间隔,筛选出间隔小于10分钟的记录; - 最后用
DISTINCT去重,得到所有符合条件的用户ID。
方案二:使用自连接(适配MySQL 5.x版本)
如果你的MySQL版本不支持窗口函数(比如5.7及以下),可以用自连接的方式实现:
SELECT DISTINCT t1.user_id FROM transactions t1 INNER JOIN transactions t2 ON t1.user_id = t2.user_id -- 确保t1的交易时间晚于t2的交易时间 AND t1.create_time > t2.create_time -- 计算两次交易的分钟间隔小于10分钟 AND TIMESTAMPDIFF(MINUTE, t2.create_time, t1.create_time) < 10;
代码说明:
- 将交易表和自身做内连接,关联条件是同一个用户,且
t1的交易时间晚于t2; - 用
TIMESTAMPDIFF()筛选出间隔小于10分钟的交易对; - 通过
DISTINCT去重,得到目标用户ID。
验证你的测试数据
根据你提供的交易数据,运行上述代码后会得到以下用户:
101:有两笔交易间隔3分钟(8:34和8:37)106:有两笔交易间隔7分钟(13:11和13:18)
内容的提问来源于stack exchange,提问作者justnewbie89
相关产品推荐
相关产品推荐

