2013-12-11 44 views
1

我使用一個巨大的醫院活動記錄數據集。每條記錄都代表某位病人完成的工作。我關注的是那些經歷過「門診」活動的患者,如出席預約或診所。 在數據中,我們得到的記錄是重複的;在六個月的時間內,病人被證明已經多次參加了他們的首次出院病人。這是發送數據的醫院的錯誤。我們必須確定這些記錄以回饋挑戰。SQL Server - 需要根據同一列的多個條件獲取重複記錄

我有以下SQL語句查找'病人代碼'出現多次的記錄。

SELECT * FROM dbo.Z_ForQueries a 
JOIN (SELECT PatientCode 
FROM dbo.Z_ForQueries 
GROUP BY PatientCode 
HAVING COUNT (*) > 1) b 
ON a.PatientCode = b.PatientCode 
WHERE [Multiple OPFA in month] = 'y' 

我不能爲我的生活找出如何語法的下一個位;對於每組重複的患者代碼,我只想查看其中一條記錄的「月」爲7(這是我正在處理的當前月份)的記錄。如果月份中重複記錄的組中沒有「7」,那麼我不需要看到它們。

例如,患者代碼L000066715有4條記錄,我可以看到每條記錄代表同一醫院專業中相同的初始門診患者預約。顯然你只能'先參加'一次。每個記錄都有一個月份編號; 3,4,6 & 7.由於該患者代碼在第7個月有其重複記錄之一,因此我需要將其與其他3個記錄一起返回到結果中。

其他患者代碼存在一式兩份,但他們的記錄都不是來自第7個月的,所以他們不需要返回。

我希望我已經適當地設置了一些幫助!謝謝。

+0

是這個TSQL? PL/SQL? MySQL的? – ojf

+0

哦,對不起,TSQL。 – steveck79

回答

0

像這樣應該工作:

SELECT * 
FROM dbo.Z_ForQueries a 
JOIN (
    SELECT PatientCode, 
      MAX(CASE WHEN MONTH(dateColumn) = 7 THEN 1 ELSE 0 END) As InMonth 
    FROM  dbo.Z_ForQueries 
    GROUP BY PatientCode 
    HAVING COUNT (*) > 1 
    ) b ON a.PatientCode = b.PatientCode 
      And InMonth = 1 
WHERE [Multiple OPFA in month] = 'y' 

說明:

的情況下表達的行返回1,其中月= 7,和0在所有其它情況。因此,如果GROUP中的任何行有Month = 7,且只有在他們做了,則這個CASE表達式的MAX(..)因此返回1。

+0

謝謝@RBarryYoung – steveck79

+0

哎呀,錯過了時間限制,意思是說;謝謝@RBarryYoung。它讓我更接近了一點。我忘記提及MAX語句,我的月份列不是日期時間,它包含代表月份的整數。結果數量減半,但它仍然給我記錄重複的患者代碼在其中一個重複項上沒有月「7」的記錄。因爲我不完全理解MAX語句在子CASE語句中所做的事情,所以我在這裏強調了自己的優勢。學習曲線!! – steveck79

+0

@ steveck79解釋追加到我的答案。 – RBarryYoung

相關問題