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
.