PostgreSQL中的行编号

前端之家收集整理的这篇文章主要介绍了PostgreSQL中的行编号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当结果由某些列排序时,如何获取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

实际上,我必须复制ORDER子句到查询,使其功能

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的意见为什么。

猜你在找的Postgre SQL相关文章