2015-02-24 40 views
1

當談到SQL時,我幾乎是個noob,所以我們將不勝感激。我有一個大型數據集,我正在篩選醫院。我從6個不同的表中提取數據,並且每次訪問時我的一個表都有重複的行。我只想爲每次訪問拉一行(哪一行被拉入並不重要)。我知道我需要使用DISTINCT或GROUP BY子句,但是我的語法必須是錯誤的。SQL重複行多重聯接

所以這個工作好,但是當醫生進入病人的問題清單,並進行了更改它refiles整個列表,這再次填充ProblemList表。因此,對於1次訪問,由於ProblemList的原因,我可能會得到4個重複條目,而我只需要一個。哪一個也沒關係。

我試過引用其他問題,並嵌套另一個SELECT語句,但我只是不斷收到語法錯誤。

這就是重複值的樣子:

1111111111 SMITH,JOHN 1111 1/1/1901 CHEST PAIN 1111 2 111-111-1111 1/1/1901 12:15 DIS IN DOEJO GLU 120 H 1/2/1901 6:35 NULL CHEST PAIN Diabetes type 2, controlled 
1111111111 SMITH,JOHN 1111 1/1/1901 CHEST PAIN 1111 2 111-111-1111 1/1/1901 12:15 DIS IN DOEJO GLU 120 H 1/2/1901 6:35 NULL CHEST PAIN Diabetes type 2, controlled 
1111111111 SMITH,JOHN 1111 1/1/1901 CHEST PAIN 1111 2 111-111-1111 1/1/1901 12:15 DIS IN DOEJO GLU 120 H 1/2/1901 6:35 NULL CHEST PAIN Diabetes type 2, controlled 
1111111111 SMITH,JOHN 1111 1/1/1901 CHEST PAIN 1111 2 111-111-1111 1/1/1901 12:15 DIS IN DOEJO GLU 120 H 1/2/1901 6:35 NULL CHEST PAIN Diabetes type 2, controlled 

在最後的「2型糖尿病,控制」是什麼導致重複。如果我從查詢中刪除ProblemListVisit和ProblemList表,我只能得到一行數據。

最重要的是獲得所有獨特的測試結果,但不是所有重複的問題列表條目(只是想知道他們有什麼類型的糖尿病,一次)。

謝謝!

+0

爲了得到一個獨特的,你應該把'distinct'這個單詞放在你的單詞旁邊'select',然後按原樣運行查詢。仍然最好找出你有重複的原因。據推測,問題列表訪問和問題列表表格中存在您未在您的選擇列表中顯示的值,但這些值並不明確。通過執行'select *'來更好地追蹤這些值並找出導致「重複」的值。 – paqogomez 2015-02-24 22:01:58

+0

在將DISTINCT放在那裏之前,我會嘗試着解決真正的問題。選擇所有列'SELECT * ...'並找到在其他重複行中不同的列,這將是一個很好的故障排除步驟。 – dan08 2015-02-24 22:07:01

+0

正如@ dan08所說,但我最關心的是'ProblemList'表中的重複性質,而不是在查詢結果中,因爲前者驅動後者。 – 2015-02-24 22:09:57

回答

1

代替的DISTINCT,我認爲將是實現這一目標,你也可以移動每個表產生多行成一個子查詢,其中您GROUP BY值的最快捷的方式,你尋求你的JOINS和SELECTS。

有兩個優點在這裏:

  1. 您在這些更精細的表格輸出和

  2. 獲得更多的控制,你減少對JOIN的開銷,這會降低你的I/O和CPU使用率,當你通過子查詢中的WHERE子句限制他們允許的內容時。

代碼:

SELECT 
     ADV.[VisitID]   AS VisitID 
     ,ADV.[Name]    AS Name 
     ,ADV.[UnitNumber]  AS UnitNumber 
     ,CONVERT(DATE,ADV.[BirthDateTime])       AS BirthDate 
     ,ADV.[ReasonForVisit] AS ReasonForVisit 
     ,ADV.[AccountNumber] AS AccountNumber 
     ,DATEDIFF(day, ADV.ServiceDateTime, DIS.DischargeDateTime) AS LOS 
     ,ADV.[HomePhone]  AS PhoneNumber 
     ,ADV.[ServiceDateTime] AS ServiceDateTime 
     ,ADV.[Status]   AS 'Status' 
     ,PRV.[PrimaryCareID] AS PCP 
     ,LAB.[TestMnemonic]  AS Test 
     ,LAB.[ResultRW]   AS Result 
     ,LAB.[AbnormalFlag]  AS AbnormalFlag 
     ,LAB.[ResultDateTime] AS ResultDateTime 
     ,DIS.[Diagnosis]  AS DischargeDiagnosis 
     ,DIS.[ErDiagnosis]  AS ERDiagnosis 
     ,DCP.[TextLine]   AS ProblemList 


FROM   Visits          ADV 
    LEFT JOIN Tests          LAB    ON (LAB.VisitID = ADV.VisitID AND 
                       LAB.SourceID = ADV.SourceID) 
    LEFT JOIN Discharge         DIS    ON (DIS.VisitID = LAB.VisitID AND 
                       DIS.SourceID = LAB.SourceID) 
    LEFT JOIN Providers         PRV    ON (PRV.VisitID = DIS.VisitID AND 
                       PRV.SourceID = DIS.SourceID) 
    LEFT JOIN 
     (
      SELECT 
       VisitID, 
       SourceID, 
       PatientID 
      FROM ProblemListVisits 
      GROUP BY 
       VisitID, 
       SourceID, 
       PatientID 
     )             EPS    ON (EPS.VisitID = PRV.VisitID AND 
                       EPS.SourceID = PRV.SourceID)                         
    LEFT JOIN 
     (
      SELECT 
       PatientID, 
       SourceID, 
       TextLine 
      FROM ProblemList 
      WHERE 
       [TextLine]  LIKE '%Diabetes%'   OR 
       [TextLine]  LIKE '%Diabetic%'   OR 
       [TextLine]  LIKE '%DM2%'    OR 
       [TextLine]  LIKE '%DKA%'    OR 
       [TextLine]  LIKE '%Hyperglycemia%'  OR 
       [TextLine]  LIKE '%Hypoglycemia%' 
      GROUP BY 
       PatientID, 
       SourceID, 
       TextLine 
     )             DCP    ON (DCP.PatientID = EPS.PatientID AND 
                       DCP.SourceID = EPS.SourceID) 


WHERE (LAB.[TestMnemonic] = 'GLU'      OR 
     LAB.[TestMnemonic] = '%HA1C'     ) AND 
     ADV.[Status]  != 'DIS CLI'    ) 

在你仍然得到數倍它表明,[一個TextLine]具有在ProblemList表中的每個VisitID/PatientID組合多個值的事件。此時,您可以從您的GROUP BY子句中刪除該子集,並在子字段中使用某種類型的聚合,如MAX([TextLine])。不過,我懷疑,在使用DISTINCT或使用此子查詢方法後,您不會有重複項。

+0

你的代碼是石頭人!非常感謝。我把這個作爲答案,因爲它比只使用「Distinct」快了20秒。唯一的問題是,我得到了'[TextLine]'的NULL值以及子查詢的WHERE子句中定義的值。 所以我剛剛在主查詢結束時添加了: 'WHERE DCP。[TextLine] IS NOT NULL)',在'ADV。[Status]!='DIS CLI''之後,它的工作方式就像一個魅力一樣。 非常感謝您爲我提供的幫助! – mslhrt 2015-02-25 15:15:58

+0

我剛剛閱讀了這個答案,並意識到我遺漏了'AND DCP。[TextLine] IS NOT NULL'條件來複制原始查詢的相同輸出。對不起,我錯過了。 – JNevill 2015-02-25 15:17:26

+0

忘了提及,我不得不使用GROUP BY子句中的實際列名稱而不是數字。所以它是GROUP BY [PatientID],[SourceID],[TextLine]'和上面的。另外請注意,在第一個子查詢中不應該有額外的'SourceID'。再次感謝代碼@JNevill – mslhrt 2015-02-25 15:27:47

1

Distinct條款應做的伎倆 但如果沒有,你可以改變

LEFT JOIN ProblemList DCP    ON (DCP.PatientID = EPS.PatientID AND 
              DCP.SourceID = EPS.SourceID) 

OUTER APPLY (Select top 1 DCP.[TextLine] FROM ProblemList DCP WHERE 
              DCP.PatientID = EPS.PatientID 
              AND DCP.SourceID = EPS.SourceID) DCP 
+0

這正是我一直在尋找的。我有一個查詢,只需添加一個連接,即使沒有引用任何內容,也會導致每一行都被直接複製。這個替換清除了這一點。 – 2015-07-20 13:17:09

0

嘗試SELECT後加入DISTINCT。事情是這樣的:

SELECT DISTINCT 
    ADV.[VisitID]   AS VisitID 
    ,ADV.[Name]    AS Name 
    ...