Выбрать из общей таблицы по 3 записи каждого типа
Таблица project:
id | name | customer_id
1 | Project 1 | 1
2 | Project 2 | 1
3 | Project 3 | 2
4 | Project 4 | 2
5 | Project 5 | 2
6 | Project 6 | 3
7 | Project 7 | 3
8 | Project 8 | 3
9 | Project 9 | 3
10 | Project 10 | 3
Таблица customer:
id | name
1 | Customer 1
2 | Customer 2
3 | Customer 3
Результат должен быть таким:
customer.name | project.name
Customer 2 | Project 3
Customer 2 | Project 4
Customer 2 | Project 5
Customer 3 | Project 6
Customer 3 | Project 7
Customer 3 | Project 8
Пробовал следующий запрос, но он не работает (подзапрос в выражении вернул больше одной строки):
SELECT
c.name,
(
SELECT p.name
FROM project p
WHERE p.customer_id = c.id
LIMIT 3
)
FROM
customer c;
Ответы (2 шт):
Автор решения: Stefanov.sm
→ Ссылка
В етом случае можно исспользовать cross join lateral.
SELECT c.name, l.*
FROM customer c
CROSS JOIN LATERAL
(SELECT p.name pname FROM project p WHERE p.customer_id = c.id LIMIT 3) l;
Удаление тех, у кого <3 результатов:
with t as
(
SELECT c.name, l.*, count(*) over (partition by c.id) pcnt
FROM customer c
CROSS JOIN LATERAL
(SELECT p.name pname FROM project p WHERE p.customer_id = c.id LIMIT 3) l
)
select name, pname from t where pcnt = 3 order by pname;
Автор решения: Slava Rozhnev
→ Ссылка
Вот рабочий запрос исрользующий window functions :
with data as (
select
c.name customer_name,
p.name project,
row_number() over (partition by p.customer_id) rn,
count(*) over (partition by p.customer_id) cnt
from
project p
join customer c on p.customer_id = c.id
)
select customer_name, project
from data
where cnt > 2 and rn < 4;