Ponieważ there are only two rows per price
, może to być dużo prostsze i szybsze:
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;
Ta forma niesie ze sobą dodatkową korzyść, ponieważ możesz bezpośrednio używać wszystkich kolumn z obu wierszy.
Dla bardziej złożonych scenariuszy (nie jest to konieczne), możesz użyć funkcji okna, jak już wspomniano. Oto prostsze podejście niż sugerowane:
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;
Tutaj potrzebna jest tylko jedna funkcja okna. I jeden poziom zapytania, ponieważ DISTINCT ON
jest stosowany po funkcje okna. Kolejność sortowania w oknie jest zgodna z ogólną kolejnością sortowania, co pomaga w wydajności.