Mysql
 sql >> Base de données >  >> RDS >> Mysql

Solution de contournement MySQL pour les fonctions de fenêtre

MySQL ne prend pas en charge la fonction de fenêtre, mais vous pouvez utiliser des sous-requêtes corrélées dans le SELECT list pour récupérer exactement une colonne :

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 ...

Faites EXPLAIN ce. C'est un peu la même chose en termes de logique d'exécution que le CROSS APPLY dans SQL Server.

Une autre approche est une auto-jointure :

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

Testez les performances des deux approches.

Vous pouvez faire beaucoup plus de jointures créatives, comme

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