sql >> Database >  >> RDS >> PostgreSQL

Oracle-equivalent van Postgres' DISTINCT ON?

Hetzelfde effect kan in Oracle worden gerepliceerd met behulp van de first_value() functie of door een van de rank() of row_number() functies.

Beide varianten werken ook in Postgres.

first_value()

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

first_value geeft de eerste waarde voor de partitie, maar herhaalt deze voor elke rij, dus het is noodzakelijk om deze te gebruiken in combinatie met distinct om een ​​enkele rij voor elke partitie te krijgen.

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

Vervanging van row_number() met rank() in dit voorbeeld levert hetzelfde resultaat op.

Een kenmerk van deze variant is dat deze kan worden gebruikt om de eerste N . op te halen rijen voor een bepaalde partitie (bijv. "laatste 3 bijgewerkt") door simpelweg rownumber = 1 te wijzigen naar rownumber <= N .



  1. MySQL-fout 1215:kan geen beperking voor externe sleutels toevoegen

  2. Hoe te repareren "De configuratie-optie 'Agent XPs' bestaat niet" in SQL Server (T-SQL)

  3. Oracle-identiteitskolom en invoegen in select

  4. Hoe krijg ik een lijst van alle tabellen in een database met TSQL?