2014-06-10 10 views
5

साथ पंक्तियों को फ़िल्टर करने एसक्यूएल समूह उपयोग करने के लिए मैं निम्न तालिकाकैसे अधिकतम दिनांक मान

CREATE TABLE Test 
    (`Id` int, `value` varchar(20), `adate` varchar(20)) 
; 

INSERT INTO Test 
    (`Id`, `value`, `adate`) 
VALUES 
    (1, 100, '2014-01-01'), 
    (1, 200, '2014-01-02'), 
    (1, 300, '2014-01-03'), 
    (2, 200, '2014-01-01'), 
    (2, 400, '2014-01-02'), 
    (2, 30 , '2014-01-04'), 
    (3, 800, '2014-01-01'), 
    (3, 300, '2014-01-02'), 
    (3, 60 , '2014-01-04') 
; 

है मैं परिणाम जो केवल ईद की तारीख से अधिकतम मूल्य होने का चयन करता है हासिल करना चाहते हैं। यानी

आईडी, मूल्य, adate

1, 300,'2014-01-03'  
2, 30 ,'2014-01-04'  
3, 60 ,'2014-01-04' 

कैसे मैं इस group by का उपयोग कर प्राप्त कर सकते हैं? मैंने निम्नानुसार किया है लेकिन यह काम नहीं कर रहा है।

Select Id,value,adate 
from Test 
group by Id,value,adate 
having adate = MAX(adate) 

किसी क्वेरी के साथ मदद कर सकते हैं?

उत्तर

3

आप एक डीबीएमएस विश्लेषणात्मक कार्यों आप ROW_NUMBER का उपयोग कर सकते है कि प्रयोग कर रहे हैं:

SELECT Id, Value, ADate 
FROM ( SELECT ID, 
        Value, 
        ADate, 
        ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Adate DESC) AS RowNum 
      FROM Test 
     ) AS T 
WHERE RowNum = 1; 

नहीं तो आप एक एकत्रित करने में शामिल होने का उपयोग करने की आवश्यकता होगी Test से परिणामों को फ़िल्टर करने के लिए आईडी द्वारा अधिकतम तिथि केवल उन तारीखों पर जहां दिनांक उस आईडी

के लिए अधिकतम तिथि से मेल खाता है
SELECT Test.Id, Test.Value, Test.ADate 
FROM Test 
     INNER JOIN 
     ( SELECT ID, MAX(ADate) AS ADate 
      FROM Test 
      GROUP BY ID 
     ) AS MaxT 
      ON MaxT.ID = Test.ID 
      AND MaxT.ADate = Test.ADate; 
-1

मैं प्रत्येक आईडी के लिए अधिकतम दिनांक का चयन करें इस

Select t1.Id, t1.value, t1.adate 
from Test as t1 
where t1.adate = (select max(t2.adate) 
        from Test as t2 
        where t2.id = t1.id) 
8

की तरह कुछ की कोशिश करेंगे।

select id, max(adate) max_date 
from test 
group by id 

शेष कॉलम प्राप्त करने के लिए उस पर शामिल हों।

select t1.* 
from test t1 
inner join (select id, max(adate) max_date 
      from test 
      group by id) t2 
on t1.id = t2.id and t1.adate = t2.max_date; 
+0

क्या होगा अगर 'adate' को दो अन्य स्तंभों के माध्यम से निर्धारित किया जाना चाहिए जिन्हें संघ के रूप में संभाला जाना चाहिए? –

+1

@ फ़ैबियनपिकोन: सिद्धांत समान है। एक क्वेरी लिखें जो "आईडी" प्रति पंक्ति एक पंक्ति लौटाती है, और इसमें शामिल हों। आपको यूनियन क्वेरी लिखनी पड़ सकती है, और उसके बाद से चुनें। (चयन करें * से चुनें ... यूनियन चुनें ...)) –

2

प्रयास करें:

select 
    * 
from 
    tbl a 
where 
    a.adate=(select MAX(adate) from tbl b where b.Id=a.Id) 
संबंधित मुद्दे