Как правильно организовать включение нескольких групп в единый набор результатов?

Допустим, у меня есть таблица контактов со столбцом приоритета. Значения приоритета - 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
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы были близки. Вместо использования 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;

Другие вопросы по теме