चूँकि 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
बाद लागू किया जाता है खिड़की के कार्य। विंडो में सॉर्ट ऑर्डर समग्र सॉर्ट ऑर्डर से सहमत है, प्रदर्शन में मदद करता है।