Допустим, у меня есть таблица контактов со столбцом приоритета. Значения приоритета - 1-3. Я хочу выбрать контакты 12 контактов, и здесь должны быть перечислены контакты со всеми приоритетами - 4 контакта с приоритетом 1, 4 - с приоритетом 2 и 4 - с приоритетом 3.
FIRST_NAME | LAST_NAME | PRIORITY |
-----------|-----------|----------|
A | AB | 1 |
qwerty | AB | 1 |
Efr | AB | 1 |
University | AB | 1 |
United | AB | 2 |
Art | AB | 2 |
Falco | AB | 2 |
Some | AB | 2 |
123 | AB | 3 |
Greeb | AB | 3 |
Greea | AB | 3 |
Greem | AB | 3 |
Если я сделаю просто приоритет ORDER BY, это, очевидно, предоставит мне сначала только контакты с приоритетом 1, а затем остальные.
Я думал, что могу использовать здесь оконную функцию PostgreSQL, но не уверен, можно ли это сделать.
SELECT * FROM
(SELECT
first_name, last_name, priority, created_at,
ROW_NUMBER() OVER (PARTITION BY priority ORDER BY created_at ASC) AS rank FROM contacts
) c
LIMIT 10


Вы были близки. Вместо использования LIMIT вам необходимо ограничить набор результатов только записями, номера строк которых меньше или равны 4 (для каждого приоритетного раздела).
SELECT first_name, last_name, priority, created_at
FROM
(
SELECT c.*,
ROW_NUMBER() OVER (PARTITION BY priority ORDER BY created_at) AS rn
FROM contacts c
) t
WHERE rn <= 4;