प्रत्येक समूह का अधिकतम मूल्य चुनें


87
Name    Value   AnotherColumn
-----------
Pump 1  8000.0  Something1
Pump 1  10000.0 Something2
Pump 1  10000.0 Something3
Pump 2  3043    Something4
Pump 2  4594    Something5
Pump 2  6165    Something6

मेरी टेबल कुछ इस तरह दिखती है। मैं जानना चाहता हूं कि प्रत्येक पंप के लिए अधिकतम मूल्य का चयन कैसे करें।

select a.name, value from out_pumptable as a,
(select name, max(value) as value from out_pumptable where group by posnumber)g where and g.value = value

यह कोड काम करता है, लेकिन मुझे पम्प 1 की दो प्रविष्टियाँ मिलती हैं, क्योंकि इसमें समान मूल्य वाली दो प्रविष्टियाँ हैं।

जवाबों:


182
select name, max(value)
from out_pumptable
group by name

38
लेकिन यह पोस्टग्रेज या किसी अन्य RDBMS के साथ सख्ती से काम नहीं करेगा GROUP BYGROUP BYअपने प्रत्येक स्तंभ को सख्त रूप से SELECTया तो आपके सामने प्रकट होना चाहिए या GROUP BYएक समग्र फ़ंक्शन में उपयोग किया जाना चाहिए।
निकब डे

4
सही। "MySQL में काम करता है" इस संदर्भ में मूल रूप से इसका मतलब है कि यह दुर्घटना नहीं करता है, न कि यह आवश्यक रूप से सही परिणाम देता है।
क्रेग

2
@ गलत, यह क्वेरी rdbms के सभी स्वादों में काम करती है और डेटा को अपेक्षित रूप से वापस करती है, क्योंकि ओपी पूरे समूह के प्रति अधिकतम मूल्य के साथ पूरे रिकॉर्ड को वापस करने के बाद नहीं था, लेकिन प्रति पंप अधिकतम मूल्य चाहता था। चयन सूची में 2 फ़ील्ड हैं: नाम और मूल्य। नाम क्लॉज द्वारा समूह में है और मूल्य अधिकतम के माध्यम से एकत्र किया जाता है। मैं उस उत्तर के किसी भी संस्करण को नहीं देख सकता जहाँ चयन सूची में अधिक क्षेत्र होते।
छाया

3
@ क्रेग यह डिफ़ॉल्ट व्यवहार नहीं था । लगभग 3 साल पहले इसे v5.7.5 में बदल दिया गया था। लेकिन फिर, आप इस बिंदु को याद करते हैं: इस उत्तर में कोड sql मानक का अनुपालन करता है, इसलिए सेटिंग द्वारा mysql का समूह अप्रासंगिक है।
छाया

13
@ नाइकअब क्या मुझे कुछ याद आ रहा है? प्रत्येक स्तंभ में है या एक एकत्रीकरण समारोह में समूह में या तो
रोब

17
SELECT
  b.name,
  MAX(b.value) as MaxValue,
  MAX(b.Anothercolumn) as AnotherColumn
FROM out_pumptabl
INNER JOIN (SELECT 
              name,
              MAX(value) as MaxValue
            FROM out_pumptabl
            GROUP BY Name) a ON 
  a.name = b.name AND a.maxValue = b.value
GROUP BY b.Name

ध्यान दें कि यदि आपके पास प्राथमिक कुंजी है तो यह बहुत आसान होगा। यहाँ एक उदाहरण है

SELECT * FROM out_pumptabl c
WHERE PK in 
    (SELECT
      MAX(PK) as MaxPK
    FROM out_pumptabl b
    INNER JOIN (SELECT 
                  name,
                  MAX(value) as MaxValue
                FROM out_pumptabl
                GROUP BY Name) a ON 
      a.name = b.name AND a.maxValue = b.value) 

आह, खतरा। मैंने उदाहरण को बहुत सरल बना दिया। तालिका के और भी स्तंभ हैं, जो इसे थोड़ा जटिल बनाते हैं>। <
वाई वोंग

यदि अधिक स्तंभों को बस उन्हें चुनिंदा में जोड़ा जाए
m.edmondson

क्या आप स्तंभों के बारे में विस्तार से बता सकते हैं। आप किसके द्वारा समूह बनाने की कोशिश कर रहे हैं?
जॉन हार्टसॉक

@Wai गलत मैं देख रहा हूं कि आपने एक और कॉलम जोड़ा है लेकिन आपको यह समझाने की आवश्यकता है कि आप इसके साथ क्या करना चाहते हैं? क्या आप उस कॉलम से मान वापस करना चाहते हैं? क्या आप नाम और SomeOtherColumn द्वारा समूह बनाना चाहते हैं?
जॉन हार्टस्कॉक

एक और कॉलम जोड़ा। मैं उन मूल्यों के साथ प्रत्येक पंप के लिए अधिकतम मूल्य प्राप्त करना चाहता हूं जो अन्य कॉलम से अधिकतम मूल्य की पंक्ति में हैं। क्या मैं बहुत भ्रमित हो रहा हूं?
वई डोंग

16
select name, value 
from( select name, value, ROW_NUMBER() OVER(PARTITION BY name ORDER BY value desc) as rn
from out_pumptable ) as a
where rn = 1

यह एकमात्र उदाहरण है जो मेरे मामले के लिए काम करता है। मेरे पास 'नामांकन' के प्रति कई मूल्य हैं। मुझे प्रत्येक नामांकन के लिए अंतिम मूल्य की आवश्यकता है, बाहरी छोड़ दिया गया। इस id DESCपर आदेश दिया PARTITIONऔर इस क्वेरी को एक में लपेटा LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idऔर पूरी तरह से काम करता है।
लुकासुरूदा

3
select Name, Value, AnotherColumn
from out_pumptable
where Value =
(
  select Max(Value)
  from out_pumptable as f where f.Name=out_pumptable.Name
)
group by Name, Value, AnotherColumn

इस तरह की कोशिश करो, यह काम करता है।




-3
SELECT DISTINCT (t1.ProdId), t1.Quantity FROM Dummy t1 INNER JOIN
       (SELECT ProdId, MAX(Quantity) as MaxQuantity FROM Dummy GROUP BY ProdId) t2
    ON t1.ProdId = t2.ProdId
   AND t1.Quantity = t2.MaxQuantity
 ORDER BY t1.ProdId

यह आपको विचार देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.