sql >> Database >  >> RDS >> Mysql

Mysql-oplossing voor vensterfuncties

MySQL heeft geen ondersteuning voor vensterfuncties, maar u kunt een gecorreleerde subquery gebruiken in de SELECT lijst om precies één kolom op te halen:

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

Doe EXPLAIN het. Dit is een beetje hetzelfde in termen van uitvoeringslogica als de CROSS APPLY in SQL Server.

Een andere benadering is een 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

Test beide benaderingen op prestaties.

Je kunt veel creatievere joins doen, zoals

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


  1. Hoe kan ik een SQL Server-verbindingsreeks instellen?

  2. Hoe rijen uit drie tabellen te verwijderen - queryfout

  3. Hoe verticale gegevens omzetten in horizontale gegevens met SQL?

  4. jQuery automatisch aanvullen (op afstand) - voorbeeld