2013-02-27 136 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個小時。