PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Oracle-Äquivalent von Postgres' DISTINCT ON?

Derselbe Effekt kann in Oracle entweder durch Verwendung von first_value() repliziert werden Funktion oder durch Verwendung einer der rank() oder row_number() Funktionen.

Beide Varianten funktionieren auch in Postgres.

first_value()

select distinct col1, 
first_value(col2) over (partition by col1 order by col2 asc)
from tmp

first_value gibt den ersten Wert für die Partition an, wiederholt ihn aber für jede Zeile, daher ist es notwendig, ihn in Kombination mit distinct zu verwenden um eine einzelne Zeile für jede Partition zu erhalten.

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

row_number() ersetzen mit rank() in diesem Beispiel ergibt das gleiche Ergebnis.

Ein Merkmal dieser Variante ist, dass sie verwendet werden kann, um das erste N zu holen Zeilen für eine bestimmte Partition (z. B. "letzte 3 aktualisiert"), indem Sie einfach rownumber = 1 ändern zu rownumber <= N .