Как заставить SQL row_number() начинать с 1, игнорируя условия WHERE
Я пытаюсь реализовать разбиение на страницы на стороне сервера в retool, используя Athena в качестве источника данных, и кажется, что для того, чтобы заставить его работать, мне нужно каким-то образом заставить row_number() начинаться с 1.
Запрос имеет дополнительные условия в WHERE, и он запрашивает результаты на основе динамической даты начала и даты окончания, собранных с помощью средства выбора диапазона дат и времени. Это означает, что номер строки может начинаться с любого значения в зависимости от выбранных дат.
Это мой запрос (query1), вдохновленный поддержкой AWS Athena (Presto) OFFSET:
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)
В таблице есть
страница 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 в
Это означает, что query1 будет возвращать результаты только начиная со страницы 3, где он покажет только те две записи, которые имеют rn =29 и rn =30, потому что:
строки с rn <29 не находятся на странице 1, странице 2 и странице 3.
строки с 29 <= rn <= 30 находятся на странице 3.
строки с 31 <= rn <= 40 находятся на странице 4.
и так далее.
Следуя приведенному выше описанию, как я могу заставить row_number начинаться с 1? Любое решение, подходящее для моего случая, но без использования row_number(), тоже подойдет.
Редактировать для решения, предоставленного Гордоном Линоффом:
попробовал выполнить следующий запрос, представленный в решении, но 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);
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);
Обратите внимание, что без - как для номера строки, так и для запроса - результаты неопределенны. Позвольте предположить, что у вас действительно есть
ORDER BY
s и просто упростили запрос вопроса.