目前,我需要查找彼此在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
谢谢。
答案 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
我希望这有帮助!