Pro PostgreSQL si myslím, že chcete lag
funkce okna
porovnat řádky; bude to mnohem efektivnější než vlastní připojení a filtr. To nebude fungovat s MySQL, protože se zdá, že stále nepodporuje standardní funkce okna SQL:2003; viz níže.
Chcete-li najít pouze dvě nejnižší, můžete použít dense_rank
funkce okna nad ticketid
a poté výsledky filtrujte tak, aby vrátily pouze řádky, kde dense_rank() = 2
, tj. řádek s časovým razítkem druhý od nejnižšího, kde lag()
vytvoří řádek s nejnižším časovým razítkem.
Viz tento SQLFiddle který ukazuje ukázkový DDL a výstup.
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;
Použil jsem ticketdate
jako název pro sloupec data, protože date
je hrozný název pro sloupec (je to název datového typu) a nikdy by se neměl používat; Aby to fungovalo, musí být v mnoha situacích citován dvakrát.
Přenosný přístup je pravděpodobně vlastní připojení, které zveřejnili ostatní. Výše uvedený přístup k funkci okna pravděpodobně funguje také na Oracle, ale nezdá se, že by fungoval v MySQL. Pokud mohu zjistit, nepodporuje funkce okna SQL:2003.
Definice schématu bude fungovat s MySQL, pokud SET sql_mode = 'ANSI'
a použijte timestamp
místo timestamp with time zone
. Zdá se, že funkce okna nebudou; MySQL se dusí OVER
doložka. Viz tento SQLFiddle
.