PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

विंडो फ़ंक्शंस में रिंग डेटा संरचना का उपयोग कैसे करें

  • 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 विंडो फ़ंक्शन:तुलना द्वारा विभाजन
  • अधिकतम और न्यूनतम तिथि के साथ पोस्टग्रेएसक्यूएल क्वेरी और प्रति पंक्ति संबद्ध आईडी


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एकाधिक पंक्तियों को सम्मिलित करते समय डुप्लिकेट के साथ क्या होता है?

  2. Django AutoField प्रारंभ मान को संशोधित करें

  3. PostgreSql 'PDOException' संदेश के साथ 'ड्राइवर नहीं मिल सका'

  4. मैं PostgreSQL ट्रिगर से ईमेल कैसे भेज सकता हूं?

  5. PostgreSQL - बाधाओं को अक्षम करना