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.
Lo RDBMS y la versión está usando? – Lamak
Estoy usando postgresql9 pero traté de evitar cualquier postgres-ismo. Avíseme si dejo pasar algo :-) –