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
.