查找在1分钟内发生的具有相同ID的事务

时间:2018-01-19 20:30:59

标签: mysql sql

目前,我需要查找彼此在1分钟内发生的所有交易。

输出的示例如下所示:

ID, Transaction_ID  , Datetime
123, 12345          , 2017-02-01 00:01:00 
124, 12345          , 2017-02-01 00:02:00 
125, 12345          , 2017-02-01 02:02:00 

所以,正如你所看到的,前两个交易ID是相同的,交易是在1分钟之内完成的,所以我想要显示这两个,但不是最后一个,因为它被采取相隔2小时,即使它具有相同的交易ID。

这是我当前的查询:

select t.id, t.datetime, tl.transaction_id
from transactions t
left join transaction_log tl on tl.transaction_log_id = t.id
where t.datetime >= @start
and t.datetime<@end
group by t.id

谢谢。

2 个答案:

答案 0 :(得分:1)

使用ON条件中的时间戳,自行加入表格。

SELECT t1.transaction_id, t1.id, t1.datetime, t2.id, t2.datetime
FROM transactions AS t1
JOIN transactions AS t2 
    ON t1.transaction_id = t2.transaction_id
    AND t1.datetime >= DATE_SUB(t2.datetime, INTERVAL 1 MINUTE)
    AND t1.id < t2.id

答案 1 :(得分:0)

为了进一步解决Barmar的问题,您还需要使用group by来过滤在一分钟内有两个以上事务时创建的任何重复对。这是由于交叉连接(CROSS JOIN相当于JOIN),它将在一分钟内显示每个事务的每个事务实例,甚至本身(即:一分钟内3个事务总共将有9行。“AND t1 .id&lt; t2.id“约束将减少到3行,但不是你想要的那些。)可以使用row_number()over(partition by id)= 1,但我不相信MySQL支持它。

SELECT t1.transaction_id, t1.id, t1.datetime, count(*) as cnt
FROM transactions AS t1
CROSS JOIN transactions AS t2 
    ON t1.transaction_id = t2.transaction_id
    AND (t1.datetime BETWEEN DATE_SUB(t2.datetime, INTERVAL 1 MINUTE) AND DATE_ADD(t2.datetime, INTERVAL 1 MINUTE))
    AND t1.id <> t2.id
GROUP BY 1,2,3

我希望这有帮助!