2015-01-22 14 views
12

Załóżmy, że już kolejne danePostgresql wyodrębnić ostatni wiersz dla każdego ID

id date   another_info 
    1  2014-02-01   kjkj 
    1  2014-03-11   ajskj 
    1  2014-05-13   kgfd 
    2  2014-02-01   SADA 
    3  2014-02-01   sfdg 
    3  2014-06-12   fdsA 

chcę dla każdego wyciągu id ostatnie informacje:

id date   another_info 
    1  2014-05-13   kgfd 
    2  2014-02-01   SADA 
    3  2014-06-12   fdsA 

Jak mogę zarządzać że?

Odpowiedz

19

Najskuteczniejszym sposobem jest użycie distinct on operatorowi postgres'

select distinct on (id) id, date, another_info 
from the_table 
order by id, date desc; 

Jeśli chcesz rozwiązanie, które działa na bazach danych (ale jest mniej wydajna), można użyć funkcji okna:

select id, date, another_info 
from (
    select id, date, another_info, 
     row_number() over (partition by id order by date desc) as rn 
    from the_table 
) t 
where rn = 1 
order by id; 

Rozwiązanie z funkcją okna jest w większości przypadków szybsze niż przy użyciu pod-zapytania.

+0

Dzięki, że mi wystarczy !!! –

0

Grupuj według identyfikatora i użyj dowolnych zagregowanych funkcji, aby spełnić kryteria ostatniego rekordu. Na przykład

select id, max(date), another_info 
from the_table 
group by id, another_info 
+3

znowu to nie da rzeczywistej wydajności –

+0

Czego tu mi brakuje? –

+0

Czy testowałeś swój wybór ??? –

4
select * 
from bar 
where (id,date) in (select id,max(date) from bar group by id) 

Testowany w PostgreSQL, MySQL

Powiązane problemy