Тъй като there are only two rows per price
, това може да бъде много по-просто и по-бързо:
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;
Този формуляр носи допълнителното предимство, че можете да използвате директно всички колони от двата реда.
За по-сложни сценарии (не е необходимо за това), можете да използвате прозоречни функции, както беше посочено. Ето по-прост подход от предложения:
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;
Тук е необходима само една функция за прозорец. И едно ниво на заявка, тъй като DISTINCT ON
се прилага след функции на прозореца. Редът на сортиране в прозореца е в съгласие с общия ред на сортиране, което спомага за производителността.