Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

194
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda