Article

SQL-Patterns für Betrugserkennung in Transaktionen

SQL Fraud Detection Data Analytics Security

Betrugserkennung braucht keine Machine Learning. Sie braucht SQL - die richtigen Joins, die richtigen Shapes, die richtigen Zeitfenster. Sechs Patterns für jede Transaktionstabelle, von Kreditkarten über Healthcare bis E-Commerce.

1. Velocity: Schnellfeuer testen

Gestohlene Karten werden leergeräumt bevor der Besitzer es merkt. Das Signal: Ungewöhnlich viele Transaktionen in kurzen Zeitfenstern.

SELECT cardholder_id,
       date_trunc('hour', timestamp) AS hour_bucket,
       count(*) AS tx_count
FROM transactions
WHERE timestamp >= current_date - INTERVAL '30 days'
GROUP BY 1, 2
HAVING count(*) > 10;

Wichtig: Mehrere Zeitfenster parallel testen - 1 Minute, 5 Minuten, 1 Stunde. Unterschiedliche Betrugsarten zeigen sich auf verschiedenen Skalen.

2. Impossible Travel: Zwei Orte gleichzeitig

Chicago-Betrug sieben Minuten nach Los Angeles? Eine Transaktion ist gefälscht. Cloned Cards hinterlassen unmögliche Reisezeiten.

WITH ordered_tx AS (
  SELECT cardholder_id, timestamp, location,
         LAG(timestamp) OVER (PARTITION BY cardholder_id ORDER BY timestamp) AS prev_ts,
         LAG(location) OVER (PARTITION BY cardholder_id ORDER BY timestamp) AS prev_loc
  FROM transactions
)
SELECT cardholder_id,
       haversine(prev_loc, location) / 
         nullif(EXTRACT(EPOCH FROM (timestamp - prev_ts)), 0) * 3600 AS mph
FROM ordered_tx
WHERE haversine(prev_loc, location) / 
      nullif(EXTRACT(EPOCH FROM (timestamp - prev_ts)), 0) * 3600 > 600;

Der 600 mph Threshold ist konservativ - kommerzielle Jets fliegen bei 575 mph. Striktere Werte fangen auch verdächtige Bodenreisen.

3. Amount Anomalies: Runde Beträge

$1.00, $5.00, $10.00 - fast immer Card-Testing. $99.99? $499.99? Jemand kennt die Limits und bleibt darunter.

SELECT cardholder_id, timestamp, amount, merchant_id
FROM transactions
WHERE (amount >= 99.50 AND amount < 100.00)
   OR (amount >= 499.50 AND amount < 500.00)
   OR amount IN (1.00, 5.00, 10.00);

4. Suspicious Merchants: Skimmer-Hotspots

Ein kompromittierter Kartenleser am Zapfsäulen erzeugt Dutzende Betrugsfälle. Das Signal: Ungewöhnlich viele verschiedene Karten an einem Merchant in kurzer Zeit.

SELECT merchant_id,
       date_trunc('hour', timestamp) AS hour_bucket,
       count(DISTINCT cardholder_id) AS unique_cards,
       sum(amount) AS total_amount
FROM transactions
WHERE timestamp >= current_date - INTERVAL '7 days'
GROUP BY 1, 2
HAVING count(DISTINCT cardholder_id) > 20
  AND sum(amount) > 5000;

5. Off-Hours: Nächtliche Aktivität

Jeder hat ein typisches Aktivitätsmuster. Transaktionen um 3 Uhr morgens, wenn der Account sonst nie aktiv ist, sind verdächtig.

6. Chained Signals: Window Functions

Die wahre Power entsteht durch Kombination. Window Functions erlauben kontinuierliche Scoring über Transaktions-Historien.

SELECT *,
       count(*) OVER (PARTITION BY cardholder_id 
                      ORDER BY timestamp
                      RANGE BETWEEN INTERVAL '24 hours' PRECEDING AND CURRENT ROW) 
         AS tx_last_24h,
       sum(amount) OVER (PARTITION BY cardholder_id 
                         ORDER BY timestamp
                         RANGE BETWEEN INTERVAL '7 days' PRECEDING AND CURRENT ROW) 
         AS spent_last_7d
FROM transactions;

Zusammenfassung

SQL ist das Fundament der Betrugserkennung. Diese sechs Patterns decken Velocity, Geometry, Amounts, Merchants, Timing und Combinations ab. Machine Learning kann darauf aufsetzen, aber ohne diese Grundlagen fehlt der First Line of Defense.