2014-06-10 17 views
5

Mam poniższej tabelijak używać grupę SQL do filtrowania wierszy o maksymalnej wartości daty

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') 
; 

chcę osiągnąć wynik, który wybiera tylko Id posiadające maksymalną wartość daty. tj

Id, wartość, aDate

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

w jaki sposób można to osiągnąć stosując group by? Zrobiłem co następuje, ale to nie działa.

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

Czy ktoś może pomóc w zapytaniu?

Odpowiedz

3

Jeśli używasz DBMS, które posiada funkcje analityczne można użyć 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; 

W przeciwnym razie trzeba będzie użyć dołączyć do zagregowany data maksymalna identyfikatora, aby przefiltrować wyniki z Test tylko do tych, w których data jest zgodna z maksymalną datą dla tego identyfikatora

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

chciałbym spróbować coś takiego

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

Wybierz maksymalny termin dla każdego identyfikatora.

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

Dołącz do tego, aby uzyskać pozostałe kolumny.

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

Co jeśli 'adate' musi zostać określone przez 2 inne kolumny, które muszą być traktowane jako związki? –

+1

@FabianPicone: Zasada jest taka sama. Napisz zapytanie, które zwraca jeden wiersz na "id" i dołącz do niego. Być może trzeba będzie napisać zapytanie UNION, a następnie WYBRAĆ z niego. (WYBIERZ * Z (WYBIERZ ... WYBÓR UNII ...)) –

2

Spróbuj:

select 
    * 
from 
    tbl a 
where 
    a.adate=(select MAX(adate) from tbl b where b.Id=a.Id)