W przypadku PostgreSQL myślę, że chcesz lag
funkcja okna
porównać wiersze; będzie to znacznie wydajniejsze niż samodzielne łączenie i filtrowanie. To nie zadziała z MySQL, ponieważ nadal nie obsługuje standardowych funkcji okna SQL:2003; patrz poniżej.
Aby znaleźć tylko dwa najniższe, możesz użyć dense_rank
funkcja okna nad ticketid
, a następnie przefiltruj wyniki, aby zwrócić tylko wiersze, w których dense_rank() = 2
, czyli wiersz z drugim od najniższego znacznika czasu, gdzie lag()
wygeneruje wiersz z najniższym znacznikiem czasu.
Zobacz ten SQLFiddle który pokazuje przykładowe DDL i dane wyjściowe.
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;
Użyłem ticketdate
jako nazwę kolumny daty, ponieważ date
to okropna nazwa kolumny (jest to nazwa typu danych) i nigdy nie powinna być używana; w wielu sytuacjach musi być cytowany podwójnie.
Podejście przenośne to prawdopodobnie samoprzyłączanie się, które opublikowali inni. Powyższe podejście do funkcji okna prawdopodobnie działa również w Oracle, ale wydaje się, że nie w MySQL. O ile wiem, nie obsługuje funkcji okna SQL:2003.
Definicja schematu będzie działać z MySQL, jeśli SET sql_mode = 'ANSI'
i użyj timestamp
zamiast timestamp with time zone
. Wygląda na to, że funkcje okien nie działają; MySQL dławi się na OVER
klauzula. Zobacz ten SQLFiddle
.