postgresql 中的 Row_number()

jav*_*ava 5 sql postgresql window-functions

我有一个疑问:

select .....
from....
order by ....
Run Code Online (Sandbox Code Playgroud)

我想向此查询添加行号。

当我读到row_number()它时说语法是:

row_number() OVER(ORDER BY ...) 
Run Code Online (Sandbox Code Playgroud)

意思是我必须这样做:

select row_number() OVER(ORDER BY ...) , .....
from....
order by ....
Run Code Online (Sandbox Code Playgroud)

这意味着我必须写两次相同的ORDER BY语句。

有没有办法做这样的事情:

select row_number() , .....
from....
order by ....
Run Code Online (Sandbox Code Playgroud)

这意味着它将采用从查询中给出的任何顺序,并简单地向其添加数字。

Gor*_*off 6

Postgres 确实允许使用以下语法:

select row_number() over (), . . .
Run Code Online (Sandbox Code Playgroud)

但是,这不需要按照外部指定的顺序返回行号order by。我认为 Postgres 在 order by 之前计算行号。

您可能会尝试使用:

select row_number() over (), . . .
from (select . . . 
      from . . .
      order by  . . .
     ) t;
Run Code Online (Sandbox Code Playgroud)

而且,这似乎可以满足您的需求(例如,一台单处理器机器,它只是做了正确的事情)。但是,这不能保证有效。子查询中的排序不适用于外部查询(尽管这可能仅在多处理器机器上可见)。

我的建议?只需重复order by两次(使用表达式或别名)。这是保证工作。而且,您可能会对优化器只需要对数据进行一次排序感到惊讶。