如何解决如何通过忽略 WHERE 条件来强制 SQL row_number() 从 1 开始
我正在尝试在 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
31
等等。
按照上面的描述,如何强制 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);
解决方法
为页面添加新的行号:
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 BY
并且只是过度简化了问题的查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。