Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL, wie man SQL schreibt, um übermäßige Transaktionen in 15-Minuten-Fenstern zu finden?

Sie können das Datum/die Uhrzeit in Sekunden umwandeln und mit den Sekunden rechnen, um den Wert innerhalb eines 15-Minuten-Taktintervalls zu erhalten:

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;

Oben wird to_seconds() verwendet . In früheren Versionen von MySQL können Sie unix_timestamp() verwenden .

Es ist schwieriger, ein 15-Minuten-Intervall zu bekommen. Sie können ausdrücken die Abfrage als:

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;

Die Leistung dieser Abfrage kann problematisch sein. Ein Index für trans(card_id, merchant_id, tran_dt) sollte sehr helfen.