0

我正在尝试在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)

返回列中不从 1 开始的值rn
在此处输入图像描述

这意味着 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);
4

1 回答 1

0

为页面添加新的行号:

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);

请注意,如果没有ORDER BY-- 对于行号和查询 -- 结果是不确定的。让我假设您确实有ORDER BYs 并且只是过度简化了对该问题的查询。

于 2021-04-29T11:47:09.023 回答