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
.