2008-12-18 17 views
11

हालांकि यह सवाल सरल दिखता है, यह बहुत मुश्किल है।अधिकतम तालिका वाले तालिका में रिकॉर्ड कैसे प्राप्त करें?

मैं निम्नलिखित कॉलम के साथ एक मेज है:

table A: 
    int ID 
    float value 
    datetime date 
    varchar(50) group 

मैं "आईडी" और रिकॉर्ड है कि अधिकतम "तिथि" शामिल की "मूल्य" प्राप्त करने के लिए चाहते हैं कॉलम "समूह" के आधार पर वर्गीकृत । की तरह कुछ "प्रत्येक समूह के लिए नवीनतम मूल्य क्या है?"

मैं प्रत्येक समूह और इसकी अधिकतम तारीख प्राप्त कर सकते हैं:

SELECT group, MAX(date) FROM A GROUP BY group; -- I also need the "ID" and "value"

लेकिन मैं उच्चतम तारीख के साथ रिकॉर्ड की "आईडी" और मान होना चाहते हैं।

ए और परिणाम के बीच एक जॉइन बनाना उत्तर हो सकता है, लेकिन यह जानने का कोई तरीका नहीं है कि कौन सा रिकॉर्ड MAX (दिनांक) संदर्भित करता है ("दिनांक" दोहराने के मामले में)।

क्या कोई मदद कर सकता है?

उत्तर

8

आप एक सबक्वेरी के साथ की कोशिश कर सकते

 
select group, id, value, date from A where date in 
(select MAX(date) as date 
    from A 
    group by group) 
order by group 
0

जब तक तिथि कॉलम प्रत्येक समूह के लिए अद्वितीय है के रूप में मुझे लगता है कि कुछ इस तरह काम कर सकते हैं:

SELECT A.ID, A.Value 
FROM A 
    INNER JOIN (SELECT Group, MAX(Date) As MaxDate FROM A GROUP BY Group) B 
    ON A.Group = B.Group AND A.Date = B.MaxDate 
+0

यह – Jonas

+0

यह एक तरह से कठिन प्रत्येक समूह के लिए एक भी हाल ही में रिकॉर्ड को खोजने के लिए बनाता है यही कारण है कि अद्वितीय नहीं है:] –

4

यह सिर्फ क्या विश्लेषणात्मक कार्यों थे के लिए बनाया गया:

select group, 
     id, 
     value 
from (
     select group, 
       id, 
       value, 
       date, 
       max(date) over (partition by group) max_date_by_group 
     from A 
     ) 
where date = max_date_by_group 
2

यदि तारीख अद्वितीय है, तो आपके पास पहले से ही आपका जवाब है। यदि तिथि अद्वितीय नहीं है, तो आपको कुछ अन्य अद्वितीयता की आवश्यकता है। एक प्राकृतिक कुंजी अनुपस्थित है, आपकी आईडी किसी भी उतनी ही अच्छी है। बस उस पर एक मैक्स (या मिन, जो भी आप पसंद करते हैं) रख:

SELECT * 
FROM A 
JOIN (
    --Dedupe any non unqiue dates by getting the max id for each group that has the max date 
    SELECT Group, MAX(Id) as Id 
    FROM A 
    JOIN (
     --Get max date for each group 
     SELECT group, MAX(date) as Date 
     FROM A 
     GROUP BY group 
    ) as MaxDate ON 
     A.Group = MaxDate.Group 
     AND A.Date = MaxDate.Date 
    GROUP BY Group 
) as MaxId ON 
    A.Group = MaxId.Group 
    AND A.Id= MaxId.Id 
संबंधित मुद्दे