2013-04-04 13 views
5

Ho i seguenti dati che desidero filtrare quindi ottenere solo una sola fila basato sul raggruppamento della prima colonna e seleziona la data maxCome selezionare una singola riga quando si raggruppa per colonna e per data massima?

co2 contiene valori unici

col1 | col2 | date 

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

così la risultati che voglio sono:

1 | 125 | 2014 
2 | 215 | 2018 

ho provato con alcuni esempi che ho trovato qui (come di seguito), nonché altro gruppo da/distinto/max (data), ma senza fortuna

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

risposta

3

cambiare la partizione nella row_number() solo partizione col1 ma mantenere l'ordine da 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 

Vedere SQL Fiddle with Demo.

Dato che era il partizionamento sia di col1 sia di col2 si ottenevano valori univoci per ogni riga. Quindi non restituirebbe la riga con la data massima.

+0

Sarà questo lavoro in [tag: oracle]? – Kermit

+1

@FreshPrinceOfSO si – Taryn

+0

[Bene, allora] (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

Io preferisco il metodo di bluefeet, ma qui è un equivalente utilizzando 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 (preso in prestito da altri post)

0
Select * from yourtable where date in 
(select max(date) from tab group by col1); 
Problemi correlati