#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)