基于光标的分页的Postgres PENULTIMATE LAST_VALUE()

问题描述 投票:0回答:1

假设我有这张桌子:

+--------+----------+
| ID     | Name     |
+--------+----------+
| 1      | John     |
+--------+----------+
| 2      | Mike     |
+--------+----------+
| 3      | Bob      |
+--------+----------+

我正在尝试使用游标方法(Relay / GraphQL)进行分页。

现在,如果用户要求从ID 1到2的玩家,我需要一种方法来了解表中是否有更多玩家。

而且我认为一种方法是使用LIMIT 2(请求的最后一个ID)+1 = 3。

所以我使用此查询:

SELECT
    *
FROM
    "players"
  LIMIT 3

在我的后端代码中,我删除最后一行,并将hasNextPage评估为true和光标内容(ID 2)。

我正在尝试找到一种使用SQL来完成这项繁重工作的方法。

我可以使用类似下面的代码创建OVER ()(虚拟)列吗?

SELECT
    *,
    LAST_VALUE ( ID ) OVER ( ) AS pageInfo
FROM
    "players"
  LIMIT 3

它可以工作,但LAST_VALUE( ID )显示的是我的第三个ID,而不是光标内容需要的第二个。

有没有办法获得PENULTIMATE LAST_VALUE ( ID )

sql database postgresql pagination rows
1个回答
1
投票

您可以使用nth_value()

SELECT p.*,
       LAST_VALUE ( ID ) OVER ( ORDER BY ID ) AS pageInfo,
       NTH_VALUE(ID, 2) OVER (ORDER BY ID DESC) as page_Info_penultimate
FROM "players" p
LIMIT 3;

注意,没有LAST_VALUE()ORDER BY返回任意值。看起来好像是“最后一个值”,但这只是巧合,不能保证。

类似地,没有LIMITORDER BY返回任意行。它可能看起来像前三个或最后三个,但这只是巧合,不能保证。

使用LAST_VALUE()这样似乎很不可思议。 。 。 MAX()似乎更口语化:

SELECT p.*,
       MAX ( ID ) OVER () AS lastvalue,
       NTH_VALUE(ID, 2) OVER (ORDER BY ID DESC) as penultimatevalue
FROM "players" p
LIMIT 3;
© www.soinside.com 2019 - 2024. All rights reserved.