计算连接症状的数量

时间:2015-06-08 16:51:23

标签: sql data-analysis

我尝试做其他语言非常简单的事情,但在SQL中它证明了相当令人费解。

我有一个数据库,患者ID为行,100个症状为列。症状是二进制,如果患者有或没有,则为0或1。让我们说患者1有0,1,1,......用于咳嗽,打喷嚏,头痛等。患者2同样有一个二元的症状列表1,0,1,....

我想要做的只是生成一个表格,该表格包含具有这些症状组合的患者数量的成对症状。

所以当我抬头看新桌子时,我可以看到有多少人同时打喷嚏和咳嗽。有多少人头痛和打喷嚏等等。只有成对。如果我抬头打喷嚏和打喷嚏,它会让我知道打喷嚏的人数。类似于行和列中症状的矩阵格式以及内容中患有此类症状的患者数量。

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

3 个答案:

答案 0 :(得分:0)

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

然而,还有另一种方法:

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

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

它不像矩阵;它只有一排,但它拥有你想拥有的一切。您可以将它扩展到包含许多字段的自己的表格。

答案 1 :(得分:0)

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

在这种情况下,最好是获得不同症状之间的关联,SQL不能解决这个问题;你需要将表转换为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]高度相关。

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

答案 2 :(得分:0)

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

关键是要取消数据的移动,以便每个症状每个患者有一行,然后将这些数据加入到自身以获得成对的症状,然后重新连接已连接的数据以获取您的计数。由于我不知道使用哪个DBMS,我无法回答这个问题,但是我创建了一个working demo in SQL Server,它应该演示如何做到这一点。 - 昨天GarethD