sql >> Database >  >> RDS >> Mysql

MySQL hoe SQL te schrijven om buitensporige transacties te vinden in vensters van 15 minuten?

U kunt de datum/tijd naar seconden converteren en de seconden rekenen om de waarde binnen een klokinterval van 15 minuten te krijgen:

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;

Het bovenstaande gebruikt to_seconds() . In eerdere versies van MySQL kunt u unix_timestamp() . gebruiken .

Het krijgen van een interval van 15 minuten is een grotere uitdaging. U kunt uitdrukken de vraag 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;

De prestaties van deze query kunnen problematisch zijn. Een index op trans(card_id, merchant_id, tran_dt) zou veel moeten helpen.



  1. overeenkomende tabelnaam met showtabellen

  2. 5 tips om uw database veilig te houden

  3. Oracle 12c Apex 4.2 ORA-24247 netwerktoegang geweigerd door toegangscontrolelijst (ACL)

  4. Is het mogelijk om een ​​subquery te doen met Sequelize.js?