PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Oracle odpowiednik Postgresa DISTINCT ON?

Ten sam efekt można odtworzyć w Oracle za pomocą funkcji first_value() lub używając jednej z funkcji rank() lub row_number() Funkcje.

Oba warianty działają również w Postgresie.

first_value()

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

first_value podaje pierwszą wartość dla partycji, ale powtarza ją dla każdego wiersza, więc konieczne jest użycie jej w połączeniu z distinct aby uzyskać jeden wiersz dla każdej partycji.

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

Zastępowanie row_number() z rank() w tym przykładzie daje ten sam wynik.

Cechą tego wariantu jest to, że można go użyć do pobrania pierwszego N wiersze dla danej partycji (np. „ostatnie 3 zaktualizowane”) po prostu zmieniając rownumber = 1 na rownumber <= N .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy wybierz, aby zaktualizować, zablokować i odblokować?

  2. Funkcja Postgres zwraca tabelę nie zwraca danych w kolumnach

  3. postgresql - liczba (brak wartości null) każdej kolumny w tabeli

  4. Zainstaluj PL/Java 1.5.2 w PostgreSQL 11

  5. Replikacja strumieniowa PostgreSQL — szczegółowe informacje