sql >> Databáze >  >> RDS >> PostgreSQL

Agregační funkce pro získání rozdílu nebo poměru dvou řádků v pořadí

Protože there are only two rows per price , může to být hodně jednodušší a rychlejší:

SELECT n.item, n.price - o.price AS diff, n.price / o.price AS ratio
FROM   price n                 -- "new"
JOIN   price o USING (item)    -- "old"
WHERE  n.day > o.day;

->SQLfiddle

Tento formulář přináší další výhodu, že můžete přímo použít všechny sloupce z obou řádků.

Pro složitější scénáře (není to nutné), můžete použít funkce okna, jak bylo uvedeno. Zde je jednodušší přístup, než jaký byl navržen:

SELECT DISTINCT ON (item)
       item
      ,price - lead(price) OVER (PARTITION BY item ORDER BY day DESC) AS diff
FROM   price
ORDER  BY item, day DESC;

Zde je potřeba pouze jedna funkce okna. A jedna úroveň dotazu, protože DISTINCT ON se použije po funkce okna. Pořadí řazení v okně souhlasí s celkovým pořadím řazení, což pomáhá výkonu.



  1. Oprávnění k uloženým procedurám MySQL

  2. SQL -- výpočet koncových dat od daného počátečního data s libovolnými přestávkami

  3. mysql + php načte listové děti s cestou

  4. Reprezentující budoucí čas v PostgreSQL