Como
there are only two rows per price
, isso pode ser muito mais simples e rápido: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;
->SQLfiddle
Este formulário traz o benefício adicional de que você pode usar todas as colunas de ambas as linhas diretamente.
Para cenários mais complexos (não é necessário para isso), você pode usar funções de janela como foi apontado. Aqui está uma abordagem mais simples do que o que foi sugerido:
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;
Apenas uma função de janela é necessária aqui. E um nível de consulta, pois
DISTINCT ON
é aplicado depois funções da janela. A ordem de classificação na janela está de acordo com a ordem de classificação geral, ajudando no desempenho.