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



假设我有这个表:

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

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

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

我认为一种方法是使用LIMIT2(请求的最后一个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,而不是光标内容所需的第二个ID。

有办法获得PENULTIMATELAST_VALUE ( ID )

您可以使用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;

请注意,不带ORDER BYLAST_VALUE()返回任意值。它看起来可能是"最后一个值",但这是巧合,不能保证。

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

像这样使用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;

最新更新