加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL中的行编号

发布时间:2020-12-13 16:43:48 所属栏目:百科 来源:网络整理
导读:当结果由某些列排序时,如何获取PostgreSQL中的行号? 例如 SELECT 30+row_number() AS position,* FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30 我认为查询将返回如下列表: position | name | salary31 | Joy | 450032 | Katie| 400033 | Frank| 3
当结果由某些列排序时,如何获取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的意见为什么。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读