2010-02-23 15 views
11

Mam tabelę z elementami użytkownika. Każdy użytkownik może mieć kilka rodzajów przedmiotów i może mieć każdy element więcej niż jeden raz. Chcę zobaczyć, ile elementów każdego typu ma każdy użytkownik. Więc używam następujące zapytanie:Jak mogę ograniczyć liczbę wyników o określoną kolumnę w 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; 

więc coś takiego:

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 

itp

Teraz chcę zobaczyć tylko 3 pierwsze pozycje każdego użytkownika . W powyższym przykładzie dla użytkownika 1 chcę zobaczyć pozycję X i Y, a dla użytkownika 2 chcę zobaczyć pozycje A, B i C.

Jak mogę to osiągnąć?

Dzięki!

+4

+1 za pytanie z danymi i oczekiwanym wynikiem! –

Odpowiedz

3

Użyj PARTYCJI PRZEZ. Coś takiego powinno zadziałać:

+0

faktycznie powinien być partycja według nazwy_użytkownika Dzięki! – Dikla

+0

Ups! Dzięki za wskazanie tego. Naprawiono teraz. – Rob

0

Niestety, nie mam PostgreSQL, aby przetestować to, ale zapytanie podobne do poniższego powinno doprowadzić do wyników, które chcesz.

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; 
+0

To da mi przedmioty z najwyższą liczbą, niezależnie od nazwy użytkownika. :-( – Dikla

Powiązane problemy