मौजूदा कार्यों के साथ इसे प्राप्त करने के कई तरीके हैं। आप मौजूदा विंडो फ़ंक्शन first_value()
और last_value()
, DISTINCT
. के साथ संयुक्त या DISTINCT ON
जुड़ने और सबक्वेरी के बिना इसे प्राप्त करने के लिए:
SELECT DISTINCT ON (userid)
userid
, last_value(rank) OVER w
- first_value(rank) OVER w AS rank_delta
FROM rankings
WINDOW w AS (PARTITION BY userid ORDER BY ts
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING);
विंडो फ़ंक्शंस के लिए कस्टम फ़्रेम नोट करेंए> !
या आप एक सबक्वेरी में बुनियादी समग्र कार्यों का उपयोग कर सकते हैं और जॉइन कर सकते हैं:
SELECT userid, r2.rank - r1.rank AS rank_delta
FROM (
SELECT userid
, min(ts) AS first_ts
, max(ts) AS last_ts
FROM rankings
GROUP BY 1
) sub
JOIN rankings r1 USING (userid)
JOIN rankings r2 USING (userid)
WHERE r1.ts = first_ts
AND r2.ts = last_ts;
अद्वितीय मानते हुए (userid, rank)
, या आपकी आवश्यकताएँ अस्पष्ट होंगी।
शिचिनिन नो समुराई
टिप्पणियों में प्रति अनुरोध, केवल प्रति उपयोगकर्ता अंतिम सात पंक्तियों के लिए (या जितने कम पाए जा सकते हैं, अगर कम हैं):
फिर, कई संभावित तरीकों में से एक। लेकिन मेरा मानना है कि यह सबसे छोटा है:
SELECT DISTINCT ON (userid)
userid
, first_value(rank) OVER w
- last_value(rank) OVER w AS rank_delta
FROM rankings
WINDOW w AS (PARTITION BY userid ORDER BY ts DESC
ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING)
ORDER BY userid, ts DESC;
उल्टे क्रम को नोट करें। पहली पंक्ति "नवीनतम" प्रविष्टि है। मैं (अधिकतम) 7 पंक्तियों का एक फ्रेम फैलाता हूं और DISTINCT ON
के साथ नवीनतम प्रविष्टि के लिए केवल परिणाम चुनता हूं ।