Poiché there are only two rows per price
, può essere molto più semplice e veloce:
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;
Questo modulo offre l'ulteriore vantaggio di poter utilizzare direttamente tutte le colonne di entrambe le righe.
Per scenari più complessi (non necessario per questo), è possibile utilizzare le funzioni della finestra come è stato sottolineato. Ecco un approccio più semplice di quello suggerito:
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;
Qui è necessaria solo una funzione finestra. E un livello di query, poiché DISTINCT ON
viene applicato dopo funzioni della finestra. L'ordinamento nella finestra concorda con l'ordinamento generale, migliorando le prestazioni.