Fondo
Soy un usuario novato de SQL. Usando PostgreSQL 13 en Windows 10 localmente, tengo una tabla t :
+--+---------+-------+ |id|treatment|outcome| +--+---------+-------+ |a |1 |0 | |a |1 |1 | |b |0 |1 | |c |1 |0 | |c |0 |1 | |c |1 |1 | +--+---------+-------+El problema
Al principio no me expliqué bien, así que reescribí el objetivo.
Resultado deseado:
+-----------------------+-----+ |ever treated |count| +-----------------------+-----+ |0 |1 | |1 |3 | +-----------------------+-----+ Primero, identifique la id que alguna vez ha sido tratada. Ser "alguna vez tratado" significa tener cualquier fila con treatment = 1 .
Segundo, cuente filas con outcome = 1 para cada uno de esos dos grupos. De mi tabla original, los id que son "alguna vez tratados" tienen un total de 3 outcome = 1, y los "nunca tratados", por así decirlo, tienen 1 `resultado = 1.
lo que he probado
Puedo conseguir gran parte del camino allí, creo, con algo como esto:
select treatment, count(outcome) from t group by treatment;Pero eso solo me da este resultado:
+---------+-----+ |treatment|count| +---------+-----+ |0 |2 | |1 |4 | +---------+-----+Para la pregunta actualizada:
SELECT ever_treated, sum(outcome_ct) AS count FROM ( SELECT id , max(treatment) AS ever_treated , count(*) FILTER (WHERE outcome = 1) AS outcome_ct FROM t GROUP BY 1 ) sub GROUP BY 1; ever_treated | count --------------+------- 0 | 1 1 | 3db<>violín aquí
Leer:
treatment = 0 ), vemos 1 x outcome = 1 .treatment = 1 ), vemos 3 x outcome = 1 . Sería más simple y rápido con valores boolean adecuados en lugar de integer .
(Respuesta a la pregunta actualizada)
aquí hay una lógica de subconsulta fácil de seguir que funciona con enteros:
select subq.ever_treated, sum(subq.count) as count from (select id, max(treatment) as ever_treated, count(*) as count from t where outcome = 1 group by id) as subq group by subq.ever_treated;