2013-02-27 83 views
0

我正在使用Micorosft SQL Server。我有两个表t1和t2,每个表都由以下变量组成:PatientID,AdmissionDate,DiagnosisCode。请注意,许可中的多个诊断显示为多行。每个表格显示不同的患者列表。这些表格很大,因此解决方案必须高效(400,000行)。我想计算表1中的患者与表2中患者的相似性。相似性定义为两位患者共有的诊断次数除以以下总和的比值:如何计算两组数据匹配

.8 *(诊断的次数表1中的患者与表2中的患者不匹配)+ .2 *(表2中与患者不匹配的患者的诊断数目+ (两位患者共有的诊断数目)

任何有关如何组织这个问题的建议表示赞赏。

+0

我认为这是一个需要交叉连接的例子 – user2001212 2013-02-27 21:50:38

+0

以下是我如何使用交叉连接来处理它:从交叉连接找到彼此匹配的诊断。然后为每组案例计算匹配和不匹配的数量。然而,解决方案似乎非常耗时。 – user2001212 2013-02-27 22:07:29

回答

0

这是我在解决这个问题的尝试,我希望其他人能找到更有效的方法:

select #t1.id1, #t1.adm1, #t1.dx1, #t2.id2, #t2.adm2, #t2.dx2, iif(#t1.dx1=#t2.dx2,1,0) as shared Into #t3 From #t1 cross join #t2 
Select id1, adm1, dx1, id2, adm2, sum(shared) as In1In2, iif(sum(shared)=0,1,0) as In1Not2 into #t4 from #t3 group by id1, adm1, dx1, id2, adm2 
Select id1, adm1, dx1, id2, adm2, sum(In1Not2) as nIn1Not2, into #t5 from #t4 group by id1, adm1, id2, adm2 
Select id1, adm1, dx2, id2, adm2, iif(sum(shared)=0,1,0) as In2Not1 into #t6 from #t3 group by id1, adm1, dx2, id2, adm2 
Select id1, adm1, id2, adm2, sum(In2Not1) as nIn2Not1 into #t7 from #t6 group by id1, adm1, id2, adm2 

在接下来的步骤中计算出的值被合并成一个共同的表。这种尝试的问题在于,在100,000的t1上运行它,并且400,000条记录的t2耗时超过2个小时。