Mysql
 sql >> Base de données >  >> RDS >> Mysql

Différence entre les dates de deux lignes consécutives

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 .