Как ограничить число результатов определенным столбцом в postgreSQL?
У меня есть таблица с элементами пользователя. Каждый пользователь может иметь несколько типов элементов и может иметь каждый элемент более одного раза. Я хочу посмотреть, сколько элементов каждого типа есть у каждого пользователя. Поэтому я использую следующий запрос:
select user_name, count(item_name) as "count_item", item_name
from my_table
group by user_name, item_name
order by user_name, count_item desc;
Итак, я получаю что-то вроде этого:
user_name | count_item | item_name
----------+-------------+-----------
User 1 | 10 | item X
User 1 | 8 | item Y
User 2 | 15 | item A
User 2 | 13 | item B
User 2 | 7 | item C
User 2 | 2 | item X
и др.
Теперь я хочу видеть только первые 3 элемента каждого пользователя. В приведенном выше примере для пользователя 1 я хочу видеть элементы X и Y, а для пользователя 2 я хочу видеть элементы A, B и C.
Как я могу это принять?
Спасибо!
Ответы
Ответ 1
Используйте PARTITION BY. Что-то вроде этого должно работать:
select user_name, count_item, item_name
from (select user_name, count(item_name) as "count_item", item_name
row_number() over (partition by user_name order by count_item desc)
from my_table)
where row_number < 4
group by user_name, item_name
order by user_name, count_item desc;
Ответ 2
К сожалению, у меня нет Postgres, чтобы проверить это, но запрос, подобный приведенному ниже, должен предоставить вам результаты, которые вы хотите.
select user_name, item_name, item_count from
(
select user_name, item_name, count(item_name) as item_count,
dense_rank() over (order by count(item_name) desc) as item_rank
from my_table
group by user_name, item_name
)
where item_rank <= 3;