Da there are only two rows per price
, det kan være meget enklere og hurtigere:
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;
Denne formular har den ekstra fordel, at du kan bruge alle kolonner fra begge rækker direkte.
Til mere komplekse scenarier (ikke nødvendigt for dette), kan du bruge vinduesfunktioner, som det er blevet påpeget. Her er en enklere tilgang end det, der er blevet foreslået:
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;
Kun én vinduesfunktion er nødvendig her. Og ét forespørgselsniveau, da DISTINCT ON
anvendes efter vinduesfunktioner. Sorteringsrækkefølgen i vinduet stemmer overens med den overordnede sorteringsrækkefølge, hvilket hjælper på ydeevnen.