Mysql
 sql >> Database >  >> RDS >> Mysql

Differenza tra date in due righe consecutive

Per PostgreSQL, penso che tu voglia il lag funzione finestra confrontare le righe; sarà molto più efficiente di un self-join e di un filtro. Questo non funzionerà con MySQL, poiché sembra ancora non supportare le funzioni standard della finestra SQL:2003; vedi sotto.

Per trovare solo i due più bassi puoi usare il dense_rank funzione della finestra sopra il ticketid , quindi filtra i risultati per restituire solo le righe in cui dense_rank() = 2 , ovvero riga con il secondo timestamp dal più basso, dove lag() produrrà la riga con il timestamp più basso.

Vedi questo SQLFiddle che mostra il DDL e l'output di esempio.

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;

Ho usato ticketdate come nome per la colonna della data perché date è un nome terribile per una colonna (è un nome di tipo di dati) e non dovrebbe mai essere usato; deve essere citato due volte in molte situazioni per funzionare.

L'approccio portatile è probabilmente l'auto-unione che altri hanno pubblicato. L'approccio della funzione finestra sopra probabilmente funziona anche su Oracle, ma non sembra in MySQL. Per quanto ne so, non supporta le funzioni della finestra SQL:2003.

La definizione dello schema funzionerà con MySQL se SET sql_mode = 'ANSI' e usa timestamp invece di timestamp with time zone . Sembra che le funzioni della finestra non lo faranno; MySQL soffoca su OVER clausola. Vedi questo SQLFiddle .