Da there are only two rows per price
, das kann viel sein einfacher und schneller:
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;
Dieses Formular hat den zusätzlichen Vorteil, dass Sie alle Spalten aus beiden Zeilen direkt verwenden können.
Für komplexere Szenarien (dafür nicht notwendig), könnten Sie, wie bereits erwähnt, Fensterfunktionen verwenden. Hier ist ein einfacherer Ansatz als der vorgeschlagene:
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 wird nur eine Fensterfunktion benötigt. Und eine Abfrageebene, da DISTINCT ON
wird nach angewendet Fensterfunktionen. Die Sortierreihenfolge im Fenster stimmt mit der Gesamtsortierreihenfolge überein, was die Leistung verbessert.