/ / एक एसक्यूएल स्टेटमेंट का उपयोग करके कई अधिकतम () मानों का चयन करना - sql, postgresql, pivot, crosstab

एकल SQL कथन का उपयोग करके एकाधिक अधिकतम () मानों का चयन करना - sql, postgresql, pivot, crosstab

मेरे पास एक टेबल है जिसमें डेटा है जो कुछ इस तरह दिखता है:

data_type, value
World of Warcraft, 500
Quake 3, 1500
Quake 3, 1400
World of Warcraft, 1200
Final Fantasy, 100
Final Fantasy, 500

मैं जो करना चाहता हूं वह इनमें से प्रत्येक मान को एक कथन में अधिकतम चुनता है। मुझे पता है कि मैं आसानी से कुछ कर सकता हूं

select data_type, max(value)
from table
where data_type = [insert each data type here for separate queries]
group by data_type

लेकिन जो मैं इसे प्रदर्शित करना चाहता हूं वह है

select data_type,
max(value) as "World of Warcraft",
max(value) as "Quake 3",
max(value) as "Final Fantasy"

इसलिए मुझे इनमें से प्रत्येक का अधिकतम मूल्य एक कथन में मिलता है। मैं ऐसा कैसे कर पाऊंगा?

उत्तर:

उत्तर № 1 के लिए 4

यदि आप एक अलग कॉलम में प्रत्येक data_type के लिए अधिकतम मान वापस करना चाहते हैं, तो आपको एक CASE अभिव्यक्ति के साथ कुल फ़ंक्शन का उपयोग करने में सक्षम होना चाहिए:

select
max(case when data_type="World of Warcraft" then value end) WorldofWarcraft,
max(case when data_type="Quake 3" then value end) Quake3,
max(case when data_type="Final Fantasy" then value end) FinalFantasy
from yourtable;

देख डेमो के साथ एसक्यूएल फिडल


जवाब के लिए 6 № 2

एक बार फिर, केवल कुछ "डेटा प्रकार" से अधिक के लिए, मैं उपयोग करने का सुझाव देता हूं 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 Crosstab क्वेरी

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

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

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

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

संक्षेप में: यह वर्तमान PostgreSQL (9.3 सहित) के साथ संभव नहीं है बहुरंगी प्रकारों के साथ सन्निकटन, एरे या हस्टोरोर प्रकारों के साथ प्रतिबंधों को दरकिनार करने के तरीके। आपके लिए काफी अच्छा हो सकता है। पर ये सख्ती से संभव नहीं एकल 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() सभी प्रकार के अवैध (स्तंभों के लिए) नाम और स्वच्छता को रोकना एसक्यूएल इंजेक्शन.

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


उत्तर № 3 के लिए 1

यदि आप चाहते हैं कि आपका डेटा एकल स्ट्रिंग में एकत्र किया जाए, तो ब्लूफेट उदाहरण के साथ जाएं, यदि आपको प्रत्येक रिकॉर्ड के साथ रिकॉर्डसेट की आवश्यकता है:

select
data_type,
max(value) as value
from table1
group by data_type