postgresql中的行号()

postgresql中的行号(),sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我有一个问题: select ..... from.... order by .... 我想在此查询中添加行号 当我读到关于row\u number()时,它说语法是: row_number() OVER(ORDER BY ...) 意思是我必须做: select row_number() OVER(ORDER BY ...) , ..... from.... order by .... 这意味着我必须编写两次相同的orderby语句 有没有一种方法可以这样做: select row_n

我有一个问题:

select .....
from....
order by ....
我想在此查询中添加行号

当我读到关于
row\u number()
时,它说语法是:

row_number() OVER(ORDER BY ...) 
意思是我必须做:

select row_number() OVER(ORDER BY ...) , .....
from....
order by ....
这意味着我必须编写两次相同的
orderby
语句

有没有一种方法可以这样做:

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

这意味着它将采用查询中给出的任何顺序,只需向其中添加数字即可。

Postgres允许以下语法:

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

您可能会尝试使用:

select row_number() over (), . . .
from (select . . . 
      from . . .
      order by  . . .
     ) t;
而且,这似乎是你想要的(例如,一台单处理器机器,它做了正确的事情)。然而,这并不能保证有效。子查询中的排序不适用于外部查询(尽管这可能仅在多处理器计算机上可见)


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

不,这是不可能的。窗口函数中使用的排序顺序不一定与整体排序相同order@a_horse_with_no_name我这里没有postgresql,但他可以通过对生成的
row\u number()
(如果它像SQL Server,则“按阶段排序”在“选择”阶段之后,因此他可以为生成的
row_number()
提供一个别名,然后对其进行排序)@xanatos:ah,对。您的意思是从查询中删除订单,按照(ORDER BY…)上方的
SELECT row_number()进行排序)正如rownum
,然后是
按rownum排序
?@java是的,完全一样。遗憾的是,SQL Fiddle现在不起作用,所以我无法测试它。正如xanatos所提到的,
选择row_number()(按顺序…)作为rn,…from…order by rn
将在PostgresLongshot中工作,但有人知道如何使用TypeForm完成这项工作吗?