Voor PostgreSQL denk ik dat je de lag
vensterfunctie
om de rijen te vergelijken; het zal veel efficiënter zijn dan een self-join en filter. Dit werkt niet met MySQL, omdat het nog steeds niet de standaard SQL:2003-vensterfuncties lijkt te ondersteunen; zie hieronder.
Om alleen de twee laagste te vinden, kun je de dense_rank
. gebruiken vensterfunctie over de ticketid
, filter vervolgens de resultaten om alleen rijen terug te geven waar dense_rank() =2
, dwz rij met de op één na laagste tijdstempel, waarbij lag()
zal de rij met de laagste tijdstempel produceren.
Zie deze SQLFiddle die voorbeeld DDL en uitvoer toont.
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;
Ik heb ticketdate
gebruikt als de naam voor de datumkolom omdat datum
is een vreselijke naam voor een kolom (het is een naam van een gegevenstype) en mag nooit worden gebruikt; het moet in veel situaties dubbel worden aangehaald om te werken.
De draagbare benadering is waarschijnlijk de self-join die anderen hebben gepost. De bovenstaande benadering van de vensterfunctie werkt waarschijnlijk ook op Oracle, maar lijkt niet te werken in MySQL. Voor zover ik kan nagaan ondersteunt het de SQL:2003 vensterfuncties niet.
De schemadefinitie werkt met MySQL als u SET sql_mode ='ANSI'
en gebruik tijdstempel
in plaats van tijdstempel met tijdzone
. Het lijkt erop dat de vensterfuncties dat niet doen; MySQL verslikt zich in de OVER
clausule. Zie deze SQLFiddle
.