Rad*_*mko 27 postgresql row-number
当某些列按结果排序时,如何在PostgreSQL中获取行号?
例如
SELECT 30+row_number() AS position, *
FROM users
ORDER BY salary DESC
LIMIT 30
OFFSET 30
Run Code Online (Sandbox Code Playgroud)
我认为查询将返回如下列表:
position | name | salary
31 | Joy | 4500
32 | Katie| 4000
33 | Frank| 3500
Run Code Online (Sandbox Code Playgroud)
实际上我必须将该ORDER子句复制到查询中才能使其正常运行:
SELECT 30+row_number(ORDER BY salary DESC) AS position, *
FROM users
ORDER BY salary DESC
LIMIT 30
OFFSET 30
Run Code Online (Sandbox Code Playgroud)
有没有其他方法如何返回有序和编号的结果,而无需复制代码?
我知道这可以通过在应用程序本身中增加一些变量来解决,但我想在数据库层执行此操作并返回已编号的应用程序结果...
小智 37
不 - order by在窗口函数order by中,select语句的子句在功能上是两个不同的东西.
此外,您的声明产生:ERROR: window function call requires an OVER clause,所以:
SELECT 30+row_number(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30
Run Code Online (Sandbox Code Playgroud)
应该:
SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30
Run Code Online (Sandbox Code Playgroud)
请注意,如果工资不是唯一的,则无法保证他们甚至会产生相同的订单.也许最好这样做:
SELECT *
FROM ( SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, *
FROM users )
ORDER BY position LIMIT 30 OFFSET 30
Run Code Online (Sandbox Code Playgroud)
另请注意,如果使用不同的偏移量多次运行此查询,则需要:
或者你可能会得到重复和丢失的行.有关原因,请参阅此答案的评论.
| 归档时间: |
|
| 查看次数: |
57315 次 |
| 最近记录: |