Lo stesso effetto può essere replicato in Oracle utilizzando il first_value() o utilizzando uno dei rank() o row_number() funzioni.
Entrambe le varianti funzionano anche in Postgres.
first_value()
select distinct col1,
first_value(col2) over (partition by col1 order by col2 asc)
from tmp
first_value dà il primo valore per la partizione, ma lo ripete per ogni riga, quindi è necessario usarlo in combinazione con distinct per ottenere una singola riga per ogni partizione.
row_number() / rank()
select col1, col2 from (
select col1, col2,
row_number() over (partition by col1 order by col2 asc) as rownumber
from tmp
) foo
where rownumber = 1
Sostituzione di row_number() con rank() in questo esempio restituisce lo stesso risultato.
Una caratteristica di questa variante è che può essere utilizzata per recuperare il primo N righe per una determinata partizione (es. "ultime 3 aggiornate") semplicemente cambiando rownumber = 1 a rownumber <= N .