sql >> Databáze >  >> RDS >> Mysql

Rozdíl mezi daty ve dvou po sobě jdoucích řádcích

Pro PostgreSQL si myslím, že chcete lag funkce okna porovnat řádky; bude to mnohem efektivnější než vlastní připojení a filtr. To nebude fungovat s MySQL, protože se zdá, že stále nepodporuje standardní funkce okna SQL:2003; viz níže.

Chcete-li najít pouze dvě nejnižší, můžete použít dense_rank funkce okna nad ticketid a poté výsledky filtrujte tak, aby vrátily pouze řádky, kde dense_rank() = 2 , tj. řádek s časovým razítkem druhý od nejnižšího, kde lag() vytvoří řádek s nejnižším časovým razítkem.

Viz tento SQLFiddle který ukazuje ukázkový DDL a výstup.

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;

Použil jsem ticketdate jako název pro sloupec data, protože date je hrozný název pro sloupec (je to název datového typu) a nikdy by se neměl používat; Aby to fungovalo, musí být v mnoha situacích citován dvakrát.

Přenosný přístup je pravděpodobně vlastní připojení, které zveřejnili ostatní. Výše uvedený přístup k funkci okna pravděpodobně funguje také na Oracle, ale nezdá se, že by fungoval v MySQL. Pokud mohu zjistit, nepodporuje funkce okna SQL:2003.

Definice schématu bude fungovat s MySQL, pokud SET sql_mode = 'ANSI' a použijte timestamp místo timestamp with time zone . Zdá se, že funkce okna nebudou; MySQL se dusí OVER doložka. Viz tento SQLFiddle .



  1. Jak dynamicky transponovat řádky do sloupců v MySQL

  2. MySql kombinuje LIMIT a ORDER BY

  3. Tipy pro migraci z HAProxy na ProxySQL

  4. Transformace funkčnosti třídy Wrapper