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
两次(使用表达式或别名)。这保证有效。而且,您可能会对优化器只需要对数据进行一次排序感到惊讶。
我有一个问题:
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
两次(使用表达式或别名)。这保证有效。而且,您可能会对优化器只需要对数据进行一次排序感到惊讶。