Eftersom there are only two rows per price
, detta kan vara mycket enklare och snabbare:
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;
Detta formulär har den extra fördelen att du kan använda alla kolumner från båda raderna direkt.
För mer komplexa scenarier (inte nödvändigt för detta), kan du använda fönsterfunktioner som har påpekats. Här är ett enklare tillvägagångssätt än vad som har föreslagits:
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;
Endast en fönsterfunktion behövs här. Och en frågenivå, eftersom DISTINCT ON
tillämpas efter fönsterfunktioner. Sorteringsordningen i fönstret stämmer överens med den övergripande sorteringsordningen, vilket hjälper prestanda.