Karena there are only two rows per price
, ini bisa banyak lebih sederhana dan lebih cepat:
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;
Formulir ini membawa manfaat tambahan, yaitu Anda dapat menggunakan semua kolom dari kedua baris secara langsung.
Untuk skenario yang lebih kompleks (tidak perlu untuk ini), Anda dapat menggunakan fungsi jendela seperti yang telah ditunjukkan. Berikut adalah pendekatan yang lebih sederhana daripada yang disarankan:
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;
Hanya satu fungsi jendela yang diperlukan di sini. Dan satu tingkat kueri, karena DISTINCT ON
diterapkan setelah fungsi jendela. Urutan pengurutan di jendela sesuai dengan urutan pengurutan keseluruhan, membantu kinerja.