2010-02-23 6 views
11

Ich habe eine Tabelle mit Benutzerelementen. Jeder Benutzer kann mehrere Arten von Gegenständen haben und kann jeden Gegenstand mehr als einmal haben. Ich möchte sehen, wie viele Elemente jedes Typs jeder Benutzer hat. So verwende ich die folgende Abfrage:Wie kann ich die Anzahl der Ergebnisse durch eine bestimmte Spalte in postgreSQL begrenzen?

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; 

So bekomme ich so etwas wie dieses:

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 

usw.

Nun, ich möchte, dass jeder Benutzer nur die ersten 3 Artikel von sehen . Im obigen Beispiel möchte ich für Benutzer 1 die Elemente X und Y sehen, und für Benutzer 2 möchte ich die Elemente A, B und C sehen.

Wie kann ich dies erreichen?

Danke!

+4

+1 für die Abfrage mit einem Datenbeispiel und erwartetem Ergebnis! –

Antwort

3

Verwendung PARTITION BY. So etwas sollte funktionieren:

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

10 eigentlich sollte es Partition von user_name sein. Danke !! – Dikla

+0

Hoppla! Danke für das zeigen, dass. Jetzt behoben. – Rob

0

Leider habe ich keine Postgres zur Hand, um dies zu testen, aber eine Abfrage wie die folgende sollte Sie zu den Ergebnissen bringen, die Sie wollen.

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

Dies gibt mir die Elemente mit der höchsten Anzahl, unabhängig vom Benutzernamen. :-( – Dikla

Verwandte Themen