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

Differenz zwischen Datumsangaben in zwei aufeinanderfolgenden Zeilen

Ich denke, Sie möchten für PostgreSQL die lag Fensterfunktion um die Zeilen zu vergleichen; Es ist viel effizienter als eine Selbstverknüpfung und ein Filter. Dies funktioniert nicht mit MySQL, da es die standardmäßigen SQL:2003-Fensterfunktionen immer noch nicht zu unterstützen scheint; siehe unten.

Um nur die beiden niedrigsten zu finden, können Sie den dense_rank verwenden Fensterfunktion über die ticketid , filtern Sie dann die Ergebnisse, um nur Zeilen zurückzugeben, in denen dense_rank() = 2 , dh Zeile mit dem zweitniedrigsten Zeitstempel, wobei lag() erzeugt die Zeile mit dem niedrigsten Zeitstempel.

Siehe dieses SQLFiddle die Beispiel-DDL und -Ausgabe zeigt.

SELECT ticketid, extract(epoch from tdiff) FROM (
  SELECT
      ticketid,
      ticketdate - lag(ticketdate) OVER (PARTITION BY ticketid ORDER BY ticketdate) AS tdiff,
      dense_rank() OVER (PARTITION BY ticketid ORDER BY ticketdate) AS rank
  FROM Table1
  ORDER BY ticketid) x
WHERE rank = 2;

Ich habe ticketdate verwendet als Name für die Datumsspalte, weil date ist ein schrecklicher Name für eine Spalte (es ist ein Datentypname) und sollte niemals verwendet werden; es muss in vielen Situationen in doppelte Anführungszeichen gesetzt werden, damit es funktioniert.

Der portable Ansatz ist wahrscheinlich der Self-Join, den andere gepostet haben. Der obige Ansatz der Fensterfunktion funktioniert wahrscheinlich auch auf Oracle, scheint aber nicht auf MySQL zu funktionieren. Soweit ich herausfinden kann, werden die SQL:2003-Fensterfunktionen nicht unterstützt.

Die Schemadefinition funktioniert mit MySQL, wenn Sie SET sql_mode = 'ANSI' und verwenden Sie timestamp statt timestamp with time zone . Es scheint, dass die Fensterfunktionen dies nicht tun; MySQL verschluckt sich beim OVER Klausel. Siehe dieses SQLFiddle .