【问题标题】:Row_number() in postgresqlpostgresql 中的 Row_number()
【发布时间】:2016-05-09 20:12:36
【问题描述】:

我有一个问题:

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 ....

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

【问题讨论】:

  • 不,这是不可能的。窗口函数中使用的排序顺序不一定要与整体排序顺序相同
  • @a_horse_with_no_name 我这里没有postgresql,但他可以通过对生成的row_number() 进行排序来尝试(如果它像SQL Server,ORDER BY 阶段是在SELECT 阶段之后,这样他就可以给生成的row_number() 起一个别名,然后对其进行排序)
  • @xanatos:啊,对了。
  • 你的意思是从查询中删除订单,作为select row_number() OVER(ORDER BY ...) as rownum,然后order by rownum
  • @java 是的,完全一样。遗憾的是 SQL Fiddle 现在无法正常工作,所以我无法对其进行测试。

标签: sql postgresql window-functions


【解决方案1】:

Postgres 确实允许以下语法:

select row_number() over (), . . .

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

您可能很想使用:

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

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

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

【讨论】:

  • 如 xanatos 所述,select row_number() over (order by ..) as rn, .... from ... order by rn 可以在 Postgres 中使用
  • Longshot,但是有没有人知道如何使用 typeorm 来做到这一点?
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2014-10-23
  • 2022-01-11
相关资源
最近更新 更多