2013-04-04 7 views
5

mam następujące dane, które chciałbym filtrować więc tylko dostać tylko jeden wiersz w oparciu o grupowania pierwszej kolumnie i wybrać max datyJak wybrać pojedynczy wiersz podczas grupowania według kolumny i maksymalnej daty?

co2 zawiera unikalne wartości

col1 | col2 | date 

1 | 123 | 2013 
1 | 124 | 2012 
1 | 125 | 2014 
2 | 213 | 2011 
2 | 214 | 2015 
2 | 215 | 2018 

WIĘC wyniki chcę to:

1 | 125 | 2014 
2 | 215 | 2018 

próbowałem za pomocą kilku przykładów, które znalazłem na tutaj (jak poniżej), jak również przez inną grupę/odrębną/max (data), ale bez powodzenia

select t.* 
from (select t.*, 
      row_number() over (partition by col1, col2 order by date desc) as seqnum 
     from t 
    ) t 
where seqnum = 1 

Odpowiedz

3

Zmiana partycji w row_number() tylko do partycji przez col1 ale utrzymać porządek przez date desc:

select col1, col2, date 
from 
(
    select col1, col2, date, 
    row_number() over (partition by col1 
         order by date desc) as rn 
    from yourtable 
) x 
where rn = 1 

Zobacz SQL Fiddle with Demo.

Od momentu podzielenia na partycje przez col1 i col2 otrzymujesz unikalne wartości dla każdego wiersza. Więc nie zwróci wiersza z maksymalną datą.

+0

Czy to zadziała w [Tag: Oracle]? – Kermit

+1

@FreshPrinceOfSO yes – Taryn

+0

[No to] (http://cf.chucklesnetwork.agj.co/items/1/4/0/4/i-dont-always-upvote_but-when-i-do-i-have- to-t.jpg) – Kermit

0

Wolę bluefeet na sposób, ale tutaj jest równoważne użyciu MAX:

SELECT t.col1, t.col2, t.date 
FROM yourtable t 
    JOIN (
     SELECT col1, MAX(date) maxDate 
     FROM yourtable 
     GROUP BY col1 
    ) t2 on t.col1 = t2.col1 AND t.date = t2.maxDate 

SQL Fiddle Demo (zapożyczona z innego wątku)

0
Select * from yourtable where date in 
(select max(date) from tab group by col1); 
Powiązane problemy