当结果由某些列排序时,如何获取Postgresql中的行号?
例如
SELECT 30+row_number() AS position,* FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30
我认为查询将返回如下列表:
position | name | salary 31 | Joy | 4500 32 | Katie| 4000 33 | Frank| 3500
SELECT 30+row_number(ORDER BY salary DESC) AS position,* FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30
no – 在窗口函数中的顺序和select语句的order by子句在功能上是两个不同的东西。
此外,您的语句生成:ERROR:window函数调用需要一个OVER子句,因此:
SELECT 30+row_number(ORDER BY salary DESC) AS position,* FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30
应该:
SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position,* FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30
注意,如果工资不是唯一的,那么不能保证他们甚至会生产相同的订单。也许最好做:
SELECT * FROM ( SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position,* FROM users ) ORDER BY position LIMIT 30 OFFSET 30
另请注意,如果您使用不同的偏移量多次运行此查询,则需要:
>将您的isolation level设置为可序列化
>确保您所订购的内容是唯一的
或者您可能会得到重复和丢失的行。参见this answer的意见为什么。