2011-03-21 7 views
7

Tengo muchas tablas que se ven así: (id, user_id, object_id). A menudo me interesa la pregunta "¿Cuántos usuarios tienen un objeto? ¿Cuántos tienen dos?". y me gustaría ver la distribución.¿Cómo se puede obtener un histograma de recuentos de una tabla de unión sin usar una subconsulta?

La respuesta obvia a este aspecto:

select x.ucount, count(*) 
from (select count(*) as ucount from objects_users group by user_id) as x 
group by x.ucount 
order by x.ucount; 

Esto produce resultados como:

ucount | count 
-------|------- 
1  | 15 
2  | 17 
3  | 23 
4  | 104 
5  | 76 
7  | 12 

Uso de una subconsulta aquí se siente poco elegante para mí y me gustaría encontrar la manera de producir el mismo resultado sin. Además, si la pregunta que intentas hacer es un poco más complicada, se complica al pasar más información de la subconsulta. Por ejemplo, si desea que los datos agrupados aún más por la fecha de creación del usuario:

select 
    x.ucount, 
    (select cdate from users where id = x.user_id) as cdate, 
    count(*) 
from (
    select user_id, count(*) as ucount 
    from objects_users group by user_id 
) as x 
group by cdate, x.ucount, 
order by cdate, x.ucount; 

¿Hay alguna manera de evitar la explosión de subconsultas? Supongo que al final mi objeción es estética, pero hace que las consultas sean difíciles de leer y difíciles de escribir.

+0

Lo RDBMS y la versión está usando? – Lamak

+0

Estoy usando postgresql9 pero traté de evitar cualquier postgres-ismo. Avíseme si dejo pasar algo :-) –

Respuesta

1

Creo que una subconsulta es exactamente la forma adecuada de hacerlo, independientemente de su RDBMS. ¿Por qué sería poco elegante?

Para la segunda consulta, simplemente se unen a la mesa users así:

SELECT 
x.ucount, 
u.cdate, 
COUNT(*) 
FROM (
SELECT 
    user_id, 
    COUNT(*) AS ucount 
FROM objects_users 
GROUP BY user_id 
) AS x 
LEFT JOIN users AS u 
ON x.user_id = u.id 
GROUP BY u.cdate, x.ucount 
ORDER BY u.cdate, x.ucount 
+0

Otro enfoque sería usar una herramienta de informes para hacer el histograma por usted. (excel o SSRS) – Jody

Cuestiones relacionadas