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)
这意味着它将采用从查询中给出的任何顺序,并简单地向其添加数字。
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两次(使用表达式或别名)。这是保证工作。而且,您可能会对优化器只需要对数据进行一次排序感到惊讶。