计算加入症状的数量

Counting the number of join symptoms

我正在尝试做一些在其他语言中非常简单的事情,但在 SQL 中却令人费解。

我有一个数据库,行是患者 ID,列是 100 种症状。症状是二元的,如果患者有或没有,则为 0 或 1。假设患者 1 有 0、1、1、... 咳嗽、打喷嚏、头痛等症状。患者 2 同样具有症状 1、0、1、....

的二进制列表

我想做的只是生成一个 table,它对成对症状进行计数,即具有该症状组合的患者数量。

所以当我在新 table 中查找时,我可以看到有多少人同时打喷嚏和咳嗽。有多少人同时有头痛和打喷嚏等症状。仅成对。如果我查找打喷嚏和打喷嚏,它会给我返回打喷嚏的人数。类似于行和列中症状的矩阵格式以及内容中患有该症状的患者数量。

使用 for 循环,这在任何其他语言中都非常容易。不过,我是 SQL 的新手,正在努力寻找一种有效的方法来做到这一点。

你的问题需要编写函数并在其中使用游标。

但是,还有一个替代方法:

假设您有一个包含四列的 table:

a   b   c   d
-------------------------
1   0   1   1
1   1   0   0
0   0   1   0
0   0   0   1
1   1   1   1
0   1   0   1
1   0   1   0
0   1   1   1
0   0   1   1
1   0   1   0

这是一个答案:

Select sum(a) as a_a, 
    (select count(*) from patients where a=1 and b=1 as a_b) as a_b, 
    (select count(*) from patients where a=1 and c=1 as a_c) as a_c, 
    (select count(*) from patients where a=1 and d=1 as a_d) as a_d, 
    sum(b) as b_b, 
    (select count(*) from patients where b=1 and c=1 as b_c) as b_c, 
    (select count(*) from patients where b=1 and d=1 as b_d) as b_d, 
    sum(c) as c_c, 
    (select count(*) from patients where c=1 and d=1 as c_d) as c_d, 
    sum(d) as d_d 

现在,结果是这样的:

a_a     a_b     a_c     a_d     b_b     b_c     b_d     c_c     c_d     d_d
-------------------------------------------------------------------------
5       2       3       2       4       2       2       7       4       6

不像矩阵;它只有一排,但它拥有您想要的一切。您可以将其扩展为您自己的 table,其中包含许多字段。

您想研究不同症状之间的相互作用,对吗?

在这种情况下,最好能得到不同症状之间的相关性,SQL不适合这个问题;您需要将 table 转换为 csv 文件,然后使用 R(甚至 excel),您可以获得相关性。

假设这是您的 CSV 文件 (C:/dataFile.csv):

a, b, c, d, e, f
----------------
1, 1, 1, 0, 1, 0
1, 1, 0, 1, 1, 1
0, 0, 0, 1, 0, 0
0, 1, 1, 0, 1, 0
1, 0, 0, 0, 1, 0
0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0
1, 1, 0, 1, 1, 1

现在,在 R Statistics 中,您可以 运行 以下命令一一执行:

> data <- read.csv("C:/dataFile.csv")
> summary(data)
> cor(data)

这是结果:

          a         b          c           d          e          f
a 1.0000000 0.5000000  0.0000000  0.25819889 0.77459667  0.5773503
b 0.5000000 1.0000000  0.5773503  0.25819889 0.77459667  0.5773503
c 0.0000000 0.5773503  1.0000000 -0.44721360 0.44721360 -0.3333333
d 0.2581989 0.2581989 -0.4472136  1.00000000 0.06666667  0.7453560
e 0.7745967 0.7745967  0.4472136  0.06666667 1.00000000  0.4472136
f 0.5773503 0.5773503 -0.3333333  0.74535599 0.44721360  1.0000000

两个具有较高相关性的症状意味着这两个症状大部分是一起变化的。例如,[a 和 e] 或 [b 和 e] 高度相关。

我希望能让您对如何处理数据分析有更广泛的了解。

@GarethD 的回答帮助解决了问题:谢谢!

关键是要对数据进行逆透视,这样每个患者的每个症状都有一行,然后将这些数据与其自身结合以获得成对的症状,然后将结合的数据回溯以获得你的计数。因为我不知道要使用哪个 DBMS,所以我无法回答这个问题,但是我创建了一个 working demo in SQL Server 来演示如何做。 – GarethD 昨天