sql >> Database teknologi >  >> RDS >> Mysql

Forskel mellem datoer i to på hinanden følgende rækker

For PostgreSQL tror jeg, du vil have lag vinduesfunktion at sammenligne rækkerne; det vil være meget mere effektivt end selvsammenføjning og filter. Dette vil ikke fungere med MySQL, da det stadig ikke ser ud til at understøtte standard SQL:2003 vinduesfunktioner; se nedenfor.

For kun at finde de to laveste kan du bruge dense_rank vinduesfunktion over ticketid , filtrer derefter resultaterne for kun at returnere rækker, hvor dense_rank() = 2 , dvs. række med næst-fra-laveste tidsstempel, hvor lag() vil producere rækken med det laveste tidsstempel.

Se denne SQLFiddle som viser eksempel DDL og output.

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;

Jeg har brugt ticketdate som navn på datokolonnen fordi date er et forfærdeligt navn for en kolonne (det er et datatypenavn) og bør aldrig bruges; det skal være dobbelt citeret i mange situationer for at virke.

Den bærbare tilgang er sandsynligvis den selvtilslutning, som andre har lagt ud. Vinduesfunktionstilgangen ovenfor virker sandsynligvis også på Oracle, men lader ikke til i MySQL. Så vidt jeg kan finde ud af, understøtter den ikke SQL:2003-vinduefunktionerne.

Skemadefinitionen fungerer med MySQL, hvis du SET sql_mode = 'ANSI' og brug timestamp i stedet for timestamp with time zone . Det lader til, at vinduesfunktionerne ikke vil; MySQL kvæler OVER klausul. Se denne SQLFiddle .



  1. Pythons mysqldb obskure dokumentation

  2. Forespørgsel for at liste antallet af poster i hver tabel i en database

  3. Sådan installeres MariaDB på CentOS 8

  4. MySQL-grupperækker for at finde tidsforskel