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

Oracle svarende til Postgres' DISTINCT ON?

Den samme effekt kan replikeres i Oracle enten ved at bruge first_value() funktion eller ved at bruge en af ​​rank() eller row_number() funktioner.

Begge varianter fungerer også i Postgres.

first_value()

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

first_value giver den første værdi for partitionen, men gentager den for hver række, så det er nødvendigt at bruge den i kombination med distinct for at få en enkelt række for hver partition.

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

Erstatter row_number() med rank() i dette eksempel giver det samme resultat.

En funktion ved denne variant er, at den kan bruges til at hente det første N rækker for en given partition (f.eks. "sidste 3 opdaterede") blot ved at ændre rownumber = 1 til rownumber <= N .



  1. Brug af SQL Server som billedlager

  2. Erklærer brugerdefineret undtagelse ved hjælp af RAISE_APPLICATION_ERROR-metoden i Oracle-databasen

  3. Wordpress Fatal fejl:Ufanget fejl:Kald til udefineret funktion mysql_connect() i /wp-includes/wp-db.php:1570

  4. Netværksadapteren kunne ikke etablere forbindelsen, når den oprettede forbindelse til Oracle DB