PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Equivalente Oracle di DISTINCT ON di Postgres?

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 .