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

एकल SQL कथन का उपयोग करके एकाधिक अधिकतम () मानों का चयन करना

एक बार फिर, केवल कुछ "डेटा प्रकारों" से अधिक के लिए, मैं crosstab() . का उपयोग करने का सुझाव देता हूं :

SELECT * FROM crosstab(
     $$SELECT DISTINCT ON (1, 2)
              'max' AS "type", data_type, val
       FROM   tbl
       ORDER  BY 1, 2, val DESC$$

    ,$$VALUES ('Final Fantasy'), ('Quake 3'), ('World of Warcraft')$$)
AS x ("type" text, "Final Fantasy" int, "Quake 3" int, "World of Warcraft" int)

रिटर्न:

type | Final Fantasy | Quake 3 | World of Warcraft
-----+---------------+---------+-------------------
max  | 500           | 1500    |    1200

बुनियादी बातों के लिए अधिक स्पष्टीकरण:
PostgreSQL क्रॉसस्टैब क्वेरी

गतिशील समाधान

मुश्किल काम है इसे पूरी तरह से गतिशील . बनाना :इसे काम करने के लिए

  • एक अज्ञात नंबर स्तंभों का (इस मामले में data_types)
  • अज्ञात नामों के साथ (data_types फिर से)

कम से कम प्रकार सर्वविदित है:integer इस मामले में।

संक्षेप में:वर्तमान PostgreSQL (9.3 सहित) के साथ यह संभव नहीं है। बहुरूपी प्रकारों के साथ सन्निकटन हैं और सरणियों या hstore प्रकारों के साथ प्रतिबंधों को दरकिनार करने के तरीके हैं। आपके लिए काफी अच्छा हो सकता है। लेकिन यह सख्ती से संभव नहीं है एकल SQL क्वेरी में अलग-अलग कॉलम के साथ परिणाम प्राप्त करने के लिए। SQL प्रकारों के बारे में बहुत कठोर है और जानना चाहता है कि क्या वापस आने की उम्मीद है।

हालांकि , यह दो . के साथ किया जा सकता है प्रश्न। पहला उपयोग करने के लिए वास्तविक क्वेरी बनाता है। उपरोक्त साधारण मामले पर निर्माण:

SELECT $f$SELECT * FROM crosstab(
     $$SELECT DISTINCT ON (1, 2)
              'max' AS "type", data_type, val
       FROM   tbl
       ORDER  BY 1, 2, val DESC$$

    ,$$VALUES ($f$     || string_agg(quote_literal(data_type), '), (') || $f$)$$)
AS x ("type" text, $f$ || string_agg(quote_ident(data_type), ' int, ') || ' int)'
FROM  (SELECT DISTINCT data_type FROM tbl) x

यह वह क्वेरी उत्पन्न करता है जिसकी आपको वास्तव में आवश्यकता है। दूसरे को उसी लेन-देन के अंदर चलाएँ समवर्ती मुद्दों से बचने के लिए।

quote_literal() . के रणनीतिक उपयोग पर ध्यान दें और quote_ident() सभी प्रकार के अवैध (स्तंभों के लिए) नामों को साफ करने और एसक्यूएल इंजेक्शन . को रोकने के लिए ।

डॉलर-उद्धरण की कई परतों से भ्रमित न हों। गतिशील प्रश्नों के निर्माण के लिए यह आवश्यक है। मैंने इसे यथासंभव सरल रखा है।



  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. पोस्टग्रेज कॉलम उपनाम समस्या

  3. PostgreSQL चेकपॉइंट सांख्यिकी को मापना

  4. क्या CSV प्रारूप के साथ Postgres COPY कमांड में कोट प्रोसेसिंग को बंद करना संभव है?

  5. मैक पर पोस्टग्रेएसक्यूएल के लिए पीडीओ-ड्राइवर स्थापित करना (ग्रहण के लिए ज़ेंड का उपयोग करना)