Bạn có thể chuyển đổi ngày / giờ thành giây và tính toán số học trên giây để nhận giá trị trong khoảng thời gian đồng hồ 15 phút:
select card_id, min(date(tran_dt)) as first_charge_time, merchant_id, count(*)
from tran
group by card_id, floor(to_seconds(tran_dt) / (60 * 15)), merchant_id
having count(*) >= 3;
Ở trên sử dụng to_seconds()
. Trong các phiên bản MySQL cũ hơn, bạn có thể sử dụng unix_timestamp()
.
Thực hiện bất kỳ khoảng thời gian 15 phút nào sẽ khó hơn. Bạn có thể bày tỏ truy vấn dưới dạng:
select t1.*, count(*) as numTransactions
from tran t1 join
tran t2
on t1.merchant_id = t2.merchanti_d and
t1.card_id = t2.card_id and
t2.tran_dt >= t1.tran_dt and
t2.tran_dt < t1.tran_dt + interval 15 minute
group by t1.id
having numTransactions >= 3;
Hiệu suất của truy vấn này có thể có vấn đề. Chỉ mục trên trans(card_id, merchant_id, tran_dt)
sẽ giúp ích rất nhiều.