Как я могу ограничить количество результатов определенным столбцом в postgreSQL? - PullRequest
11 голосов
/ 23 февраля 2010

У меня есть таблица с пользовательскими элементами. Каждый пользователь может иметь несколько типов элементов и может иметь каждый элемент более одного раза. Я хочу посмотреть, сколько предметов каждого типа есть у каждого пользователя. Поэтому я использую следующий запрос:

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.

Как мне этого добиться?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 23 февраля 2010

Использовать 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;
0 голосов
/ 23 февраля 2010

К сожалению, у меня нет 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...