sql >> Databasteknik >  >> RDS >> Mysql

MySQL hur man skriver SQL för att hitta överdrivna transaktioner i 15 minuters fönster?

Du kan konvertera datum/tid till sekunder och aritmetisera sekunderna för att få värdet inom ett 15-minuters klockintervall:

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;

Ovanstående använder to_seconds() . I tidigare versioner av MySQL kan du använda unix_timestamp() .

Att få vilket 15-minutersintervall som helst är mer utmanande. Du kan uttrycka frågan som:

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;

Den här frågans prestanda kan vara problematisk. Ett index på trans(card_id, merchant_id, tran_dt) borde hjälpa mycket.



  1. kan vi namnge en standardbegränsning i oracle

  2. Tips för att lagra PostgreSQL-säkerhetskopior på Amazon AWS

  3. Anpassade grafer för att övervaka dina MySQL-, MariaDB-, MongoDB- och PostgreSQL-system - ClusterControl-tips och tricks

  4. PÅ DUBLIKAT UPPDATERING AV NYCKEL med WHERE-villkor