Dado que there are only two rows per price
, esto puede ser mucho más simple y más 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;
Este formulario tiene el beneficio adicional de que puede usar todas las columnas de ambas filas directamente.
Para escenarios más complejos (no es necesario para esto), podría usar funciones de ventana como se ha señalado. Aquí hay un enfoque más simple que lo que se ha 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;
Aquí solo se necesita una función de ventana. Y un nivel de consulta, ya que DISTINCT ON
se aplica después funciones de ventana El orden de clasificación en la ventana coincide con el orden de clasificación general, lo que ayuda al rendimiento.