@bigashev25

Как получить первые n записей для каждого значения одного поля?

К примеру, есть таблица phone_book. В нем есть поле customer_id, которое хранит id клиента. Необходимо вытащить для каждого уникального customer_id, первые 1000 записей с таким customer_id

Получение данных в таком формате было реализовано на php путем получения в один массив `select customer_id from phone_book group by customer_id`, после чего для каждого элемента этого массива($customer_id) выполнялось "select * from phone_book where customer_id = `$customer_id` limit 1000", и добавлялось в результирующий массив.

Меня интересует можно ли получить этот же результат в одном запросе, тк текущяя реализация работает очень медленно
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Попробуй оконные функции https://www.postgresql.org/docs/current/tutorial-w...
в частности row_number()
Ответ написан
Комментировать
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
with numbered_rows as (
    select
        *,
        row_number() over(partition by user_id order by col2) as rn -- нумеруем строки каждого юзера в порятке возрастания col2
    from t
) select * from numbered_rows where rn < 4 -- выбираем первые 3 строки на юзера
order by user_id, rn;

Пример:
https://sqlize.online/s/6W
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы