Aangezien there are only two rows per price
, dit kan veel zijn eenvoudiger en sneller:
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;
Dit formulier heeft als bijkomend voordeel dat u alle kolommen uit beide rijen direct kunt gebruiken.
Voor meer complexe scenario's (hiervoor niet nodig), zou je zoals eerder aangegeven vensterfuncties kunnen gebruiken. Hier is een eenvoudiger benadering dan wat is gesuggereerd:
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;
Hier is slechts één vensterfunctie nodig. En één zoekniveau, aangezien DISTINCT ON
wordt toegepast na venster functies. De sorteervolgorde in het venster komt overeen met de algemene sorteervolgorde, wat de prestaties ten goede komt.