Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Diferença entre datas em duas linhas consecutivas


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 .