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

Tablefunc . का उपयोग करके एकाधिक कॉलम पर पिवट करें

आपकी क्वेरी के साथ समस्या यह है कि b और c समान टाइमस्टैम्प साझा करें 2012-01-02 00:00:00 , और आपके पास timestamp . है कॉलम timeof आपकी क्वेरी में सबसे पहले, इसलिए - भले ही आपने बोल्ड जोर जोड़ा हो - b और c केवल अतिरिक्त कॉलम हैं जो एक ही समूह में आते हैं 2012-01-02 00:00:00 . केवल पहला (b ) तब से वापस आ गया है (मैनुअल को उद्धृत करते हुए):

<ब्लॉकक्वॉट>

row_name कॉलम पहले होना चाहिए। category और value कॉलम उस क्रम में अंतिम दो कॉलम होने चाहिए। row_name . के बीच कोई भी कॉलम और category "अतिरिक्त" के रूप में माना जाता है। "अतिरिक्त" कॉलम समान होने की उम्मीद है समान row_name . वाली सभी पंक्तियों के लिए मूल्य।

बोल्ड जोर मेरा।
entity बनाने के लिए बस पहले दो कॉलम के क्रम को उलट दें पंक्ति का नाम और यह वांछित के रूप में काम करता है:

SELECT * FROM crosstab(
      'SELECT entity, timeof, status, ct
       FROM   t4
       ORDER  BY 1'
      ,'VALUES (1), (0)')
 AS ct (
    "Attribute" character
   ,"Section" timestamp
   ,"status_1" int
   ,"status_0" int);

entity निश्चित रूप से अद्वितीय होना चाहिए।

दोहराएं

  • row_name पहले
  • (वैकल्पिक) extra कॉलम अगला
  • category (जैसा कि दूसरे पैरामीटर द्वारा परिभाषित किया गया है) और value अंतिम

पहले . से अतिरिक्त कॉलम भरे गए हैं प्रत्येक row_name . से पंक्ति विभाजन। अन्य पंक्तियों के मानों पर ध्यान नहीं दिया जाता है, प्रति row_name . में केवल एक स्तंभ होता है भरना। आमतौर पर वे एक row_name . की प्रत्येक पंक्ति के लिए समान होंगे , लेकिन यह आप पर निर्भर है।

आपके उत्तर में भिन्न सेटअप के लिए:

SELECT localt, entity
     , msrmnt01, msrmnt02, msrmnt03, msrmnt04, msrmnt05  -- , more?
FROM   crosstab(
        'SELECT dense_rank() OVER (ORDER BY localt, entity)::int AS row_name
              , localt, entity -- additional columns
              , msrmnt, val
         FROM   test
         -- WHERE  ???   -- instead of LIMIT at the end
         ORDER  BY localt, entity, msrmnt
         -- LIMIT ???'   -- instead of LIMIT at the end
     , $$SELECT generate_series(1,5)$$)  -- more?
     AS ct (row_name int, localt timestamp, entity int
          , msrmnt01 float8, msrmnt02 float8, msrmnt03 float8, msrmnt04 float8, msrmnt05 float8 -- , more?
            )
LIMIT 1000  -- ??!!

कोई आश्चर्य नहीं कि आपके परीक्षण में प्रश्न बहुत अच्छा प्रदर्शन करते हैं। आपके परीक्षण सेटअप में 14M पंक्तियाँ हैं और आप सभी को संसाधित करते हैं उनमें से अधिकांश को LIMIT 1000 . के साथ फेंकने से पहले . कम परिणाम सेट के लिए स्रोत क्वेरी में WHERE शर्तें या LIMIT जोड़ें!

साथ ही, जिस सरणी के साथ आप काम करते हैं, वह इसके ऊपर अनावश्यक रूप से महंगी है। मैं इसके बजाय घने_रैंक () के साथ एक सरोगेट पंक्ति नाम उत्पन्न करता हूं।

db<>बेला यहाँ - एक आसान परीक्षण सेटअप और कम पंक्तियों के साथ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:PostgreSQL में टेबल दिखाएं

  2. कमांड लाइन से PostgreSQL क्वेरी चलाएँ

  3. PostgreSQL में नंबर कैसे फॉर्मेट करें

  4. PostgreSQL प्रतिकृति स्लॉट का उपयोग करना

  5. Homebrew पोस्टग्रेज टूटा हुआ