SQL/Big 查询:识别满足两个或多个条件的计数

SQL/Big Query: identify counts to meet two or more conditions

我是 SQL 的新手,在 Google Big Query 上编写查询。我有一个问题,关于我是否可以 select 计数 id 来满足一个或多个条件,两个或多个条件等。

对于一个简单的案例,假设我有一群患有不同疾病的人。如果我想 select 他们中有多少人有一个或多个条件,我可以在下面(其中 diease_X 是一个标志,0 表示没有这个人的疾病 1 代表有)。

select count(distinct ids)
from disease_table
where disease_A=1 or disease_B=1 or disease_C=1

如果我想知道有多少人患有所有疾病,我可以在 where 条件中将 or 更改为 and。但是我如何计算有 2 个或更多条件的人数?我认为可以通过列出所有疾病的可能性来解决它,或者使用总数减去只有 1 种或 0 种疾病的人数。

但是,我想知道是否有一种简单的方法可以做到这一点,因为我有 2 个后续问题:

对此的任何想法都会非常有帮助。我目前正在 Google Big Query 中编写查询,所以希望有一个神奇的子句可以用来实现它。

UNPIVOT 可能有助于解决您的问题:

  1. 首先使用 UNPIVOT 重塑您的 table。
CREATE TEMP TABLE disease_table AS
SELECT 'a' AS ids, 1 AS disease_A, 1 AS disease_B, 1 AS disease_C
 UNION ALL
SELECT 'b' AS ids, 1 AS disease_A, 0 AS disease_B, 1 AS disease_C
 UNION ALL
SELECT 'c' AS ids, 1 AS disease_A, 1 AS disease_B, 0 AS disease_C
;

SELECT * 
  FROM disease_table UNPIVOT (has_disease FOR disease_name IN (disease_A, disease_B, disease_C))
;

原来的table会变成下面这样的

  1. 统计每个人的疾病数
SELECT ids, SUM(has_disease) number_of_disease 
  FROM disease_table UNPIVOT (has_disease FOR disease_name IN (disease_A, disease_B, disease_C))
 GROUP BY ids 
;

输出:

  1. 要找出患有超过 n 种疾病的人,HAVING 子句会有所帮助。
SELECT ids, SUM(has_disease) number_of_disease 
  FROM disease_table UNPIVOT (has_disease FOR disease_name IN (disease_A, disease_B, disease_C))
 GROUP BY ids 
HAVING number_of_disease > 2