Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

199
Vistas
Conteo condicional de filas donde al menos un par califica

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 | +---------+-----+
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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 | 3

db<>violín aquí

Leer:

  • Para aquellos que no recibieron ningún tratamiento (todo treatment = 0 ), vemos 1 x outcome = 1 .
  • Para aquellos que recibieron algún tratamiento (al menos un treatment = 1 ), vemos 3 x outcome = 1 .

Sería más simple y rápido con valores boolean adecuados en lugar de integer .

over 4 years ago · Santiago Trujillo Denunciar

0

(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;
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda