Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

193
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!