COALESCE
का उपयोग करें जैसे @Justin ने प्रदान किया।-
first_value()
. के साथ /last_value()
आपको जरूरत एकORDER BY
. जोड़ने के लिए विंडो परिभाषा का खंड या आदेश अपरिभाषित है . आप उदाहरण में भाग्यशाली हैं, क्योंकि डमी टेबल बनाने के ठीक बाद पंक्तियाँ क्रम में होती हैं।
एक बार जब आपORDER BY
जोड़ते हैं , डिफ़ॉल्ट विंडो फ़्रेम वर्तमान पंक्ति . पर समाप्त होता है , और आपकोlast_value()
. विशेष मामले की आवश्यकता है कॉल करें - या विंडो फ्रेम में सॉर्ट ऑर्डर को वापस लाएं जैसा कि मेरे पहले उदाहरण में दिखाया गया है। -
विंडो परिभाषा का कई बार पुन:उपयोग करते समय, एक स्पष्ट
WINDOW
खंड वाक्य रचना को बहुत सरल करता है:
SELECT ring, part, ARRAY[
coalesce(
lag(part) OVER w
,first_value(part) OVER (PARTITION BY ring ORDER BY part DESC))
,part
,coalesce(
lead(part) OVER w
,first_value(part) OVER w)
] AS neighbours
FROM rp
WINDOW w AS (PARTITION BY ring ORDER BY part);
अभी तक बेहतर , उसी विंडो परिभाषा का पुन:उपयोग करें, ताकि Postgres एक ही स्कैन में सभी मानों की गणना कर सके। इसके लिए काम करने के लिए हमें एक कस्टम विंडो फ्रेम को परिभाषित करने की आवश्यकता है :
SELECT ring, part, ARRAY[
coalesce(
lag(part) OVER w
,last_value(part) OVER w)
,part
,coalesce(
lead(part) OVER w
,first_value(part) OVER w)
] AS neighbours
FROM rp
WINDOW w AS (PARTITION BY ring
ORDER BY part
RANGE BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING)
ORDER BY 1,2;
आप प्रत्येक विंडो फ़ंक्शन कॉल के लिए फ़्रेम परिभाषा को भी अनुकूलित कर सकते हैं:
SELECT ring, part, ARRAY[
coalesce(
lag(part) OVER w
,last_value(part) OVER (w RANGE BETWEEN CURRENT ROW
AND UNBOUNDED FOLLOWING))
,part
,coalesce(
lead(part) OVER w
,first_value(part) OVER w)
] AS neighbours
FROM rp
WINDOW w AS (PARTITION BY ring ORDER BY part)
ORDER BY 1,2;
कई भागों वाले छल्ले के लिए तेज़ हो सकता है। आपको परीक्षण करना होगा।
एसक्यूएल फिडल एक बेहतर परीक्षण मामले के साथ तीनों का प्रदर्शन। क्वेरी योजनाओं पर विचार करें।
विंडो फ़्रेम परिभाषाओं के बारे में अधिक जानकारी:
- मैनुअल में।
- PostgreSQL विंडो फ़ंक्शन:तुलना द्वारा विभाजन
- अधिकतम और न्यूनतम तिथि के साथ पोस्टग्रेएसक्यूएल क्वेरी और प्रति पंक्ति संबद्ध आईडी