sql >> Base de Datos >  >> RDS >> Mysql

Diferencia entre fechas en dos filas consecutivas

Para PostgreSQL, creo que desea el lag función de ventana para comparar las filas; será mucho más eficiente que una autounión y un filtro. Esto no funcionará con MySQL, ya que todavía no parece admitir las funciones de ventana estándar de SQL:2003; ver más abajo.

Para encontrar solo los dos más bajos, puede usar el dense_rank función de ventana sobre el ticketid , luego filtre los resultados para devolver solo las filas donde dense_rank() = 2 , es decir, fila con la segunda marca de tiempo desde la más baja, donde lag() producirá la fila con la marca de tiempo más baja.

Ver este SQLFiddle que muestra muestra DDL y salida.

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;

He usado ticketdate como el nombre de la columna de fecha porque date es un nombre terrible para una columna (es un nombre de tipo de datos) y nunca debe usarse; tiene que estar entre comillas dobles en muchas situaciones para que funcione.

El enfoque portátil es probablemente la autounión que otros han publicado. El enfoque de la función de ventana anterior probablemente también funcione en Oracle, pero no parece hacerlo en MySQL. Por lo que puedo averiguar, no es compatible con las funciones de ventana de SQL:2003.

La definición del esquema funcionará con MySQL si SET sql_mode = 'ANSI' y use timestamp en lugar de timestamp with time zone . Parece que las funciones de la ventana no lo harán; MySQL se ahoga en el OVER cláusula. Ver este SQLFiddle .