Запрос Postgres с ограничением, который выбирает все записи с похожим идентификатором

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть таблица, которая выглядит примерно так:

customer_id данные
1 123
1 456
2 789
2 101
2 121
2 123
3 123
4 456

Что я хотел бы сделать, так это выполнить a SELECT в сочетании с a LIMIT X , чтобы получить X количество записей, а также любые другие записи, которые имеют одинаковые customer_id

Пример запроса: SELECT customer_id, data FROM table ORDER BY customer_id LIMIT 3; этот запрос возвращает:

customer_id данные
1 123
1 456
2 789

Мне нужен запрос, который будет просматривать последнее customer_id значение и возвращать все оставшиеся записи, которые соответствуют LIMIT указанным. Возможно ли это сделать за одну операцию?

Желаемый результат:

customer_id данные
1 123
1 456
2 789
2 101
2 121
2 123

Ответ №1:

В Postgres 13 можно использовать with ties :

 select t.*
from t
order by customer_id
fetch first 3 rows with ties;
 

В более ранних версиях вы можете использовать in :

 select t.*
from t
where t.customer_id in (select t2.customer_id
                        from t t2
                        order by t2.customer_id
                        limit 3
                       );
 

Ответ №2:

Вы можете использовать связанный подзапрос count следующим образом:

 Select t.*
  From t
 Where 3 >= (select count(distinct customer_id)
               From t tt 
              where t.customer_id >= tt.customer_id)