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;
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.