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

MySQL-Problemumgehung für Fensterfunktionen

MySQL hat keine Unterstützung für Fensterfunktionen, aber Sie können korrelierte Unterabfragen in SELECT verwenden Liste, um genau eine Spalte abzurufen:

SELECT
  event_id,
  event_type, 
  event_time,
  (SELECT COUNT(*) FROM events EC WHERE EC.event_type = E.event_type AND EC.event_time > E.event_time) AS subsequent_event_count
FROM
  events E
WHERE ...

Machen Sie EXPLAIN es. Dies ist in Bezug auf die Ausführungslogik ungefähr dasselbe wie CROSS APPLY im SQL-Server.

Ein anderer Ansatz ist ein Self Join:

SELECT
  E.event_id,
  E.event_type,
  E.event_time,
  COUNT(EC.event_id) AS subsequent_event_count
FROM
  events E
  LEFT JOIN events EC
    ON E.event_type = EC.event_type AND E.event_type < EC.event_type
GROUP BY
  E.event_id,
  E.event_type,
  E.event_time

Testen Sie beide Ansätze auf Leistung.

Sie können viel mehr kreative Verknüpfungen erstellen, z. B.

EC.event_time > E.event_time AND EC.event_time < E.event_time + INTERVAL 1 DAY