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 个后续问题:
-
- 我的数据 table 有 20 多种疾病需要研究,所以如果我需要列出所有疾病,它会在 where 子句中列出一长串。
-
- 我也很想知道如何知道三个或更多条件、四个或更多条件的计数...
对此的任何想法都会非常有帮助。我目前正在 Google Big Query 中编写查询,所以希望有一个神奇的子句可以用来实现它。
UNPIVOT
可能有助于解决您的问题:
- 首先使用
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会变成下面这样的
- 统计每个人的疾病数
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
;
输出:
- 要找出患有超过
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
我是 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 个后续问题:
-
- 我的数据 table 有 20 多种疾病需要研究,所以如果我需要列出所有疾病,它会在 where 子句中列出一长串。
-
- 我也很想知道如何知道三个或更多条件、四个或更多条件的计数...
对此的任何想法都会非常有帮助。我目前正在 Google Big Query 中编写查询,所以希望有一个神奇的子句可以用来实现它。
UNPIVOT
可能有助于解决您的问题:
- 首先使用
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会变成下面这样的
- 统计每个人的疾病数
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
;
输出:
- 要找出患有超过
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