Если под «рангом» вы просто подразумеваете номера строк, LIMIT
& OFFSET
будет делать:
SELECT * FROM tbl ORDER BY col OFFSET 499 LIMIT 301; -- "ranks of 500 to 800"
Если вы имеете в виду фактический «ранг», реализованный оконные функции rank()
или dense_rank()
используют соответствующую функцию в подзапросе или CTE, как продемонстрировано @ downernn.
Неудобный побочный эффект: SELECT *
нельзя использовать для получения всех столбцов стола. Вы получаете дополнительный столбец «ранг» из подзапроса, если не указали окончательный список нужных столбцов.
Используйте тип строки базовой таблицы, чтобы обойти это:
SELECT (sub.t).* -- parentheses required!
FROM (
SELECT t, rank() OVER (ORDER BY col1) AS rnk -- or dense_rank()?
FROM tbl t
) sub
ORDER BY col1 -- repeart order (optional)
WHERE rnk BETWEEN 500 AND 800;