2010-02-23 36 views
11

Tengo una tabla con elementos de usuario. Cada usuario puede tener varios tipos de artículos, y puede tener cada elemento más de una vez. Quiero ver cuántos artículos de cada tipo tiene cada usuario. Así que utilizo la siguiente consulta:¿Cómo puedo limitar el número de resultados por una columna específica en 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; 

por lo que obtener algo como esto:

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 

etc.

Ahora, quiero ver sólo los primeros 3 artículos de cada usuario . En el ejemplo anterior, para el Usuario 1, quiero ver el elemento X e Y, y para el Usuario 2, quiero ver los elementos A, B y C.

¿Cómo puedo lograr esto?

Gracias!

+4

+1 para preguntar con un ejemplo de datos y el resultado esperado. –

Respuesta

3

Usar PARTITION BY. Algo como esto debería funcionar:

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

en realidad debería ser una partición por nombre_usuario. ¡Gracias! – Dikla

+0

¡Uy! Gracias por señalarlo. Solucionado ahora. – Rob

0

Lamentablemente, no tengo Postgres a mano para probar esto, pero una consulta como la siguiente debería llevarlo a los resultados que desee.

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

Esto me dará los elementos con mayor recuento, independientemente del nombre de usuario. :-( – Dikla

Cuestiones relacionadas