PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Oracle еквивалент на Postgres' DISTINCT ON?

Същият ефект може да бъде възпроизведен в Oracle или с помощта на first_value() функция или като използвате един от rank() или row_number() функции.

И двата варианта работят и в Postgres.

first_value()

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

first_value дава първата стойност за дяла, но я повтаря за всеки ред, така че е необходимо да се използва в комбинация с distinct за да получите един ред за всеки дял.

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

Замяна на row_number() с rank() в този пример дава същия резултат.

Характеристика на този вариант е, че може да се използва за извличане на първото N редове за даден дял (напр. "последните 3 актуализирани") просто чрез промяна на rownumber = 1 до 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. Как да инсталирам pg gem на PostgreSQL на Ubuntu?

  2. postgres:надстройване на потребител до суперпотребител?

  3. Python psycopg2 не се вмъква в таблицата на postgresql

  4. Как да създадете потребител с привилегии на суперпотребител в PostgreSQL

  5. Добавяне на едно от две ненулево ограничение в postgresql