For PostgreSQL tror jeg, du vil have lag vinduesfunktion
at sammenligne rækkerne; det vil være meget mere effektivt end selvsammenføjning og filter. Dette vil ikke fungere med MySQL, da det stadig ikke ser ud til at understøtte standard SQL:2003 vinduesfunktioner; se nedenfor.
For kun at finde de to laveste kan du bruge dense_rank vinduesfunktion over ticketid , filtrer derefter resultaterne for kun at returnere rækker, hvor dense_rank() = 2 , dvs. række med næst-fra-laveste tidsstempel, hvor lag() vil producere rækken med det laveste tidsstempel.
Se denne SQLFiddle som viser eksempel DDL og output.
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;
Jeg har brugt ticketdate som navn på datokolonnen fordi date er et forfærdeligt navn for en kolonne (det er et datatypenavn) og bør aldrig bruges; det skal være dobbelt citeret i mange situationer for at virke.
Den bærbare tilgang er sandsynligvis den selvtilslutning, som andre har lagt ud. Vinduesfunktionstilgangen ovenfor virker sandsynligvis også på Oracle, men lader ikke til i MySQL. Så vidt jeg kan finde ud af, understøtter den ikke SQL:2003-vinduefunktionerne.
Skemadefinitionen fungerer med MySQL, hvis du SET sql_mode = 'ANSI' og brug timestamp i stedet for timestamp with time zone . Det lader til, at vinduesfunktionerne ikke vil; MySQL kvæler OVER klausul. Se denne SQLFiddle
.