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
.