sql >> Databáze >  >> RDS >> PostgreSQL

Oracle ekvivalent Postgres' DISTINCT ON?

Stejný efekt lze replikovat v Oracle buď pomocí first_value() nebo pomocí jednoho z rank() nebo row_number() funkcí.

Obě varianty fungují také v Postgresu.

first_value()

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

first_value dává první hodnotu pro oddíl, ale opakuje ji pro každý řádek, takže je nutné ji použít v kombinaci s distinct získat jeden řádek pro každý oddíl.

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

Nahrazení row_number() pomocí rank() v tomto příkladu dává stejný výsledek.

Charakteristickým rysem této varianty je, že ji lze použít k načtení prvního N řádků pro daný oddíl (např. "poslední 3 aktualizovány") jednoduše změnou rownumber = 1 do rownumber <= N .



  1. Neplatný identifikátor SQL

  2. SQLite JSON_INSERT()

  3. Kde PostgreSQL ukládá databázi?

  4. Krytí Mysql vs kompozitní vs index sloupců