För PostgreSQL tror jag att du vill ha lag
fönsterfunktion
att jämföra raderna; det kommer att vara mycket effektivare än en självskarvning och filter. Detta kommer inte att fungera med MySQL, eftersom det fortfarande inte verkar stödja de vanliga SQL:2003-fönsterfunktionerna; se nedan.
För att bara hitta de två lägsta kan du använda dense_rank
fönsterfunktion över ticketid
, filtrera sedan resultaten för att endast returnera rader där dense_rank() = 2
, dvs rad med näst-från-lägsta tidsstämpel, där lag()
kommer att producera raden med den lägsta tidsstämpeln.
Se denna SQLFiddle som visar exempel på DDL och utdata.
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;
Jag har använt ticketdate
som namn på datumkolumnen eftersom date
är ett fruktansvärt namn för en kolumn (det är ett datatypnamn) och bör aldrig användas; det måste vara dubbla citattecken i många situationer för att fungera.
Det bärbara tillvägagångssättet är förmodligen det självanslutna som andra har postat. Fönsterfunktionsmetoden ovan fungerar förmodligen på Oracle också, men verkar inte göra det i MySQL. Såvitt jag kan ta reda på det stöder den inte SQL:2003-fönsterfunktionerna.
Schemadefinitionen fungerar med MySQL om du SET sql_mode = 'ANSI'
och använd timestamp
istället för timestamp with time zone
. Det verkar som om fönsterfunktionerna inte gör det; MySQL stryper OVER
klausul. Se denna SQLFiddle
.