Row_number() 在 postgresql 中

Row_number() in 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 ....

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

Postgres 允许语法:

select row_number() over (), . . .

但是,这并不需要 return 外部 order by 指定的顺序中的行号。我认为 Postgres 会计算 order by 之前的行号。

您可能会想使用:

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

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

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