sql >> Databasteknik >  >> RDS >> PostgreSQL

Oracle motsvarighet till Postgres' DISTINCT ON?

Samma effekt kan replikeras i Oracle antingen genom att använda first_value() funktion eller genom att använda någon av rank() eller row_number() funktioner.

Båda varianterna fungerar även i Postgres.

first_value()

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

first_value ger det första värdet för partitionen, men upprepar det för varje rad, så det är nödvändigt att använda det i kombination med distinct för att få en enda rad för varje 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

Ersätter row_number() med rank() i detta exempel ger samma resultat.

En egenskap hos denna variant är att den kan användas för att hämta det första N rader för en given partition (t.ex. "senast 3 uppdaterade") genom att helt enkelt ändra rownumber = 1 till rownumber <= N .



  1. Java-typ för datum/tid när du använder Oracle Date med Hibernate

  2. Hur man lägger till ELLER släpper kolumn från CDC-aktiverad tabell utan att förlora data i SQL Server Database - SQL Server Tutorial

  3. Hur man använder Oracle PLSQL-tabeller (associativ array eller index-för-tabell)

  4. Hur ändrar man database_url på heroku?