sql >> Database >  >> RDS >> Mysql

Verschil tussen datums in twee opeenvolgende rijen

Voor PostgreSQL denk ik dat je de lag vensterfunctie om de rijen te vergelijken; het zal veel efficiënter zijn dan een self-join en filter. Dit werkt niet met MySQL, omdat het nog steeds niet de standaard SQL:2003-vensterfuncties lijkt te ondersteunen; zie hieronder.

Om alleen de twee laagste te vinden, kun je de dense_rank . gebruiken vensterfunctie over de ticketid , filter vervolgens de resultaten om alleen rijen terug te geven waar dense_rank() =2 , dwz rij met de op één na laagste tijdstempel, waarbij lag() zal de rij met de laagste tijdstempel produceren.

Zie deze SQLFiddle die voorbeeld DDL en uitvoer toont.

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;

Ik heb ticketdate gebruikt als de naam voor de datumkolom omdat datum is een vreselijke naam voor een kolom (het is een naam van een gegevenstype) en mag nooit worden gebruikt; het moet in veel situaties dubbel worden aangehaald om te werken.

De draagbare benadering is waarschijnlijk de self-join die anderen hebben gepost. De bovenstaande benadering van de vensterfunctie werkt waarschijnlijk ook op Oracle, maar lijkt niet te werken in MySQL. Voor zover ik kan nagaan ondersteunt het de SQL:2003 vensterfuncties niet.

De schemadefinitie werkt met MySQL als u SET sql_mode ='ANSI' en gebruik tijdstempel in plaats van tijdstempel met tijdzone . Het lijkt erop dat de vensterfuncties dat niet doen; MySQL verslikt zich in de OVER clausule. Zie deze SQLFiddle .



  1. De eenvoudigste manier om meerdere spaties toe te voegen aan een string in MySQL - SPACE()

  2. OperationalError:(2002, kan geen verbinding maken met lokale MySQL-server via socket '/var/run/mysqld/mysqld.sock' (2))

  3. Twee externe sleutels in plaats van primaire

  4. Wanneer mysql_query false retourneert