2016-02-01 5 views
1

У меня есть запрос:row_number() в PostgreSQL

select ..... 
from.... 
order by .... 

Я хотел бы добавить номера строк в запросе.

Когда я прочитал о row_number() это говорит о том, что синтаксис:

row_number() OVER(ORDER BY ...) 

означает, что я должен сделать:

select row_number() OVER(ORDER BY ...) , ..... 
from.... 
order by .... 

Это означает, что я должен дважды писать один и тот же ORDER BY заявление.

Есть ли способ просто сделать что-то вроде:

select row_number() , ..... 
from.... 
order by .... 

означает, что он будет принимать все для того, что было дано из запроса и просто добавить номера к ней.

+0

Нет, это невозможно. Порядок сортировки, используемый в оконной функции, необязательно должен быть таким же, как и общий порядок сортировки. –

+0

@a_horse_with_no_name У меня здесь нет postgresql, но он мог бы попробовать просто путем упорядочивания сгенерированного 'row_number()' (if это похоже на SQL Server, фаза ORDER BY находится ПОСЛЕ фазы SELECT, поэтому он может дать псевдоним сгенерированным «row_number()», а затем заказать на нем) – xanatos

+0

@xanatos: ah, право, которое сработает. –

ответ

3

Postgres действительно позволяет синтаксис:

select row_number() over(), . . . 

Однако, это не необходимый возврату номера строк в упорядочении, указанное внешней order by. Я думаю, Postgres вычисляет номер строки перед порядком.

Вы можете захотеть использовать:

select row_number() over(), . . . 
from (select . . . 
     from . . . 
     order by . . . 
    ) t; 

И это, казалось бы делать то, что вы хотите (один единственный процессор машины, например, он просто правильно сделал). Однако это не гарантируется. Заказ в подзапросе не применяется к внешнему запросу (хотя это может быть видно только на многопроцессорных машинах).

Мой совет? Просто повторите order by дважды (используя выражение или псевдоним). Это гарантировано. И вы можете быть удивлены тому, что оптимизатор должен только сортировать данные один раз.

+0

Как упоминалось xanatos,' select row_number() over (order by ..) как rn, .... from ... order by rn' будет работать в Postgres –