我正在尝试在retool中实现服务器端分页,将 Athena 作为数据源,似乎为了使其工作,我必须以某种方式强制 row_number() 以 1 开头。
查询在WHERE 语句,它根据从日期时间范围选择器收集的动态开始日期和结束日期查询结果。这意味着行号可以以任何值开头,具体取决于所选日期。
这是我的查询 (query1),灵感来自AWS Athena (Presto) OFFSET support:
SELECT *
FROM (SELECT row_number() over() AS rn, * FROM database.my_table)
WHERE rn
BETWEEN {{table.paginationOffset}} AND {{table.paginationOffset + 10}}
AND date > CAST('{{dateRangeModule.start_date}}' AS DATE)
AND date < CAST('{{dateRangeModule.end_date}}' AS DATE)
该表有n
页数,每页显示 10 行,这意味着该BETWEEN {{table.paginationOffset}} AND {{table.paginationOffset + 10}}
条件可能会导致以下情况:
第 1 页:在 0 和 10之间
第 2 页:在 10 和 20之间
第 3 页:在 20 和 30 之间
等等。
在没有上述条件的情况下运行查询:
SELECT *
FROM (SELECT row_number() over() AS rn, * FROM database.my_table)
WHERE rn
date > CAST('{{dateRangeModule.start_date}}' AS DATE)
AND date < CAST('{{dateRangeModule.end_date}}' AS DATE)
这意味着 query1 将只返回从第 3 页开始的结果,它将只显示 rn=29 和 rn=30 的那两条记录,因为:
rn < 29 的行不在第 1 页、第 2 页和第 3 页上。
29 <= rn <= 30 的行在第 3 页。
31 <= rn <= 40 的行在第 4 页
。依此类推。
按照上面的描述,如何强制 row_number 从 1 开始?任何适合我的情况但不使用 row_number() 的解决方案也可以。
根据 Gordon Linoff 提供的解决方案进行编辑:
尝试使用解决方案中提供的以下查询,但 rn 仍然不同于 1:
SELECT t.*,
ROW_NUMBER() OVER () as page_rn
FROM (SELECT row_number() over() AS rn, t.*
FROM database.my_table t
) t
WHERE rn BETWEEN {{table.paginationOffset}} AND {{table.paginationOffset + 10}} AND
date > CAST('{{dateRangeModule.start_date}}' AS DATE) AND
date < CAST('{{dateRangeModule.end_date}}' AS DATE);