Lo siento, como recién llegado a sql (postgres en este caso), no puedo descifrar la respuesta correcta de preguntas similares. Así que aquí hay un ejemplo
Tengo dos mesas:
registros:
id | status ---------------- 1 | open 2 | open 3 | close 4 | openeventos:
id | record_id | role | something_else --------------------------------------------- 1 | 2 | admin | stringA 2 | 1 | user | stringB 3 | 4 | admin | stringC 4 | 2 | admin | stringD 5 | 2 | admin | stringE 6 | 2 | user | stringF 7 | 3 | user | stringGBásicamente, me gustaría tener un conteo (estado) que refleje cuántos registros tienen al menos un evento. rol = 'admin' en la tabla de eventos
en el ejemplo anterior sería:
status | count --------------- open | 2 close | 0Cualquier ayuda muy apreciada!
No hay necesidad de consultas anidadas. Simplemente puede usar la agregación condicional:
select r.status, count(distinct r.id) filter(where e.role = 'admin') cnt from records r inner join events e on e.record_id = r.id group by r.statusestado | centavo :----- | --: cerrar | 0 abierto | 2
Básicamente, me gustaría tener un recuento (estado) que refleje cuántos registros tienen al menos un evento. rol = 'administrador' en la tabla de eventos.
Yo sugeriría:
select r.status, count(*) filter (where has_admin) from (select r.*, (exists (select 1 from events e where e.record_id = r.id and e.role = 'admin')) as has_admin from records r ) r group by r.status; Para su pequeña muestra de datos, la diferencia entre exists y una join no importa. Sin embargo, con más datos, exists no multiplica el número de filas, lo que debería hacerlo un poco más rápido. Además, esto garantiza que se incluyan todos los estados, incluso aquellos sin eventos.