Выбрать упорядоченные записи между указанными c рангами - PullRequest
0 голосов
/ 06 марта 2020

Я выполнил запрос SQL, чтобы упорядочить (отсортировать) свои записи. Теперь, как я могу получить не 1000 лучших записей, используя лимит, а записи между 500–800? Я предоставляю определенный диапазон c и получаю все записи в этом диапазоне рангов?

Ответы [ 3 ]

2 голосов
/ 07 марта 2020

Если под «рангом» вы просто подразумеваете номера строк, 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;
0 голосов
/ 07 марта 2020

Используйте offset.

-- Fetch rows 500 to 800 inclusive
select *
from generate_series(1, 1000)
order by 1
limit 301
offset 499

offset - количество пропускаемых строк, чтобы начать с строки 500, пропустите первые 499 строк. limit равно 301, потому что есть 301 строки между 500 и 800 включительно. Используйте 300, если хотите от 500 до 800 эксклюзивных.

0 голосов
/ 06 марта 2020

Используйте оконную функцию rank или row_number (проведите некоторое исследование их различий и выберите ту, которая подходит вам) и внешний запрос для фильтрации строк:

SELECT * 
FROM
(
  SELECT f1, f2, ..., RANK() OVER (ORDER BY fn, fm, ...) as r
  FROM ...
  WHERE ...
)
WHERE r between 500 and 800
...