Para o PostgreSQL, acho que você quer o
lag
função de janela
para comparar as linhas; será muito mais eficiente do que uma auto-junção e filtro. Isso não funcionará com o MySQL, pois ainda parece não suportar as funções de janela padrão do SQL:2003; Veja abaixo. Para encontrar apenas os dois mais baixos, você pode usar o
dense_rank
função de janela sobre o ticketid
, filtre os resultados para retornar apenas as linhas em que dense_rank() = 2
, ou seja, linha com o segundo menor timestamp, onde lag()
produzirá a linha com o menor timestamp. Veja este SQLFiddle que mostra DDL e saída de amostra.
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;
Eu usei
ticketdate
como o nome da coluna de data porque date
é um nome terrível para uma coluna (é um nome de tipo de dados) e nunca deve ser usado; tem que ser duas vezes citado em muitas situações para funcionar. A abordagem portátil é provavelmente a auto-junção que outros postaram. A abordagem da função de janela acima provavelmente também funciona no Oracle, mas não parece funcionar no MySQL. Tanto quanto eu posso descobrir, ele não suporta as funções de janela SQL:2003.
A definição do esquema funcionará com o MySQL se você
SET sql_mode = 'ANSI'
e use timestamp
em vez de timestamp with time zone
. Parece que as funções da janela não; MySQL engasga no OVER
cláusula. Veja este SQLFiddle
.