Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL中的行编号_Postgresql_Row Number - Fatal编程技术网

PostgreSQL中的行编号

PostgreSQL中的行编号,postgresql,row-number,Postgresql,Row Number,当结果按某列排序时,如何在PostgreSQL中获取行号 e、 g 我假设查询将返回如下列表: 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

当结果按某列排序时,如何在PostgreSQL中获取行号

e、 g

我假设查询将返回如下列表:

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
有没有其他方法可以在不需要复制代码的情况下返回有序和编号的结果


我知道这可以通过在应用程序本身中增加一些变量来解决,但我想在数据库层这样做,并返回到已经编号的应用程序结果…

否-窗口函数中的
order by
select
语句中的
order by
子句在功能上是两件不同的事情

此外,您的语句生成:
错误:窗口函数调用需要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
还请注意,如果要使用不同的偏移量多次运行此查询,则需要:

  • 将您的设置为可序列化
  • 确保你所订购的东西是独一无二的

  • 或者,您可能会得到重复的行和缺少的行。请参阅上的注释以了解原因。

    只需“隔离级别可重复读取”即可。。。但无论哪种方式,您都需要确保连接和事务保持打开状态。。。这可能很难做到,具体取决于应用程序。
    SELECT * 
    FROM ( SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * 
           FROM users )
    ORDER BY position LIMIT 30 OFFSET 30