Перейти к основному содержанию
Перейти к основному содержанию

Предложение OFFSET FETCH

OFFSET и FETCH позволяют извлекать данные по частям. Они определяют блок строк, который вы хотите получить одним запросом.

OFFSET offset_row_count {ROW | ROWS}] [FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} {ONLY | WITH TIES}]

Значение offset_row_count или fetch_row_count может быть числом или литеральной константой. Параметр fetch_row_count можно опустить; по умолчанию он равен 1.

OFFSET задаёт количество строк, которые нужно пропустить перед началом вывода строк из результирующего набора запроса. OFFSET n пропускает первые n строк результата.

Поддерживается отрицательный OFFSET: OFFSET -n пропускает последние n строк результата.

Также поддерживается дробный OFFSET: OFFSET n — если 0 < n < 1, то пропускается первые n * 100% результата.

Пример: • OFFSET 0.1 — пропускает первые 10% результата.

Note • Дробное значение должно быть числом Float64 меньше 1 и больше нуля. • Если в результате вычисления получается дробное количество строк, оно округляется вверх до следующего целого числа.

FETCH задаёт максимальное количество строк, которое может быть в результате запроса.

Опция ONLY используется для возврата строк, которые непосредственно следуют за строками, пропущенными с помощью OFFSET. В этом случае FETCH является альтернативой предложению LIMIT. Например, следующий запрос

SELECT * FROM test_fetch ORDER BY a OFFSET 1 ROW FETCH FIRST 3 ROWS ONLY;

совпадает с запросом

SELECT * FROM test_fetch ORDER BY a LIMIT 3 OFFSET 1;

Опция WITH TIES используется для возврата всех дополнительных строк, которые в соответствии с предложением ORDER BY делят последнее место в результирующем наборе. Например, если fetch_row_count равно 5, но ещё две строки совпадают по значениям столбцов ORDER BY с пятой строкой, результирующий набор будет содержать семь строк.

:::note
Согласно стандарту, предложение OFFSET должно стоять перед предложением FETCH, если оба присутствуют. :::

:::note
Фактическое смещение также может зависеть от настройки offset. :::

Примеры

Исходная таблица:

┌─a─┬─b─┐
│ 1 │ 1 │
│ 2 │ 1 │
│ 3 │ 4 │
│ 1 │ 3 │
│ 5 │ 4 │
│ 0 │ 6 │
│ 5 │ 7 │
└───┴───┘

Использование опции ONLY:

SELECT * FROM test_fetch ORDER BY a OFFSET 3 ROW FETCH FIRST 3 ROWS ONLY;

Результат:

┌─a─┬─b─┐
│ 2 │ 1 │
│ 3 │ 4 │
│ 5 │ 4 │
└───┴───┘

Использование параметра WITH TIES:

SELECT * FROM test_fetch ORDER BY a OFFSET 3 ROW FETCH FIRST 3 ROWS WITH TIES;

Результат:

┌─a─┬─b─┐
│ 2 │ 1 │
│ 3 │ 4 │
│ 5 │ 4 │
│ 5 │ 7 │
└───┴───┘