Pour PostgreSQL, je pense que vous voulez le lag
fonction fenêtre
comparer les lignes ; ce sera beaucoup plus efficace qu'une auto-jointure et un filtre. Cela ne fonctionnera pas avec MySQL, car il ne semble toujours pas prendre en charge les fonctions de fenêtre standard SQL:2003 ; voir ci-dessous.
Pour trouver uniquement les deux plus bas, vous pouvez utiliser le dense_rank
fonction de fenêtre sur le ticketid
, puis filtrez les résultats pour ne renvoyer que les lignes où dense_rank() = 2
, c'est-à-dire la ligne avec le deuxième horodatage le plus bas, où lag()
produira la ligne avec l'horodatage le plus bas.
Voir ce SQLFiddle qui montre un exemple de DDL et de sortie.
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;
J'ai utilisé ticketdate
comme nom de la colonne de date car date
est un nom terrible pour une colonne (c'est un nom de type de données) et ne doit jamais être utilisé ; il doit être entre guillemets dans de nombreuses situations pour fonctionner.
L'approche portable est probablement l'auto-jointure que d'autres ont publiée. L'approche de la fonction de fenêtre ci-dessus fonctionne probablement aussi sur Oracle, mais ne semble pas le faire dans MySQL. Autant que je sache, il ne prend pas en charge les fonctions de fenêtre SQL:2003.
La définition du schéma fonctionnera avec MySQL si vous SET sql_mode = 'ANSI'
et utilisez timestamp
au lieu de timestamp with time zone
. Il semble que les fonctions de la fenêtre ne le feront pas ; MySQL s'étouffe avec le OVER
clause. Voir ce SQLFiddle
.