2011-07-14 119 views
2

只有結果,這似乎簡單,但我無法弄清楚如何做到這一點還是正確的描述correcltly谷歌它:(SQL - 選擇具有多個項目

簡單地說,有一個表:

PatientID | Date | Feature_of_Interest... 

我想爲多次訪問的患者繪製一些結果,當他們具有感興趣的功能時,沒有問題可以通過感興趣的功能篩選出來,但是我只希望我的結果查詢包含具有多個條目的患者

SELECT PatientID,Date,... 
    FROM myTable 
    WHERE Feature_Of_Interest is present 
    AND (Filter out PatientID's that only appear once) 

所以 - 只是不知道如何解決這個問題。我試着這樣做:

WITH X AS (Above SELECT, Count(*),...,Group by PatientID) 

然後重新運行查詢,但沒有奏效。如果需要的話,我可以將所有內容都發布出去,但是我得到的印象是我完全落後於此,所以暫緩推遲。

使用SQL Server 2008的

回答

1

你想加入一個子查詢

JOIN (
    SELECT 
     PatientID 
    FROM myTable 
    WHERE Feature_Of_Interest is present 
    GROUP BY PatientID 
    HAVING COUNT(*) > 1 
) s ON myTable.PatientID = s.PatientID 
1

你可以與訪問計數查詢開始:

SELECT PatientID, COUNT(*) as numvisits FROM myTable 
GROUP BY PatientID HAVING(numvisits > 1); 

然後你就可以加入基地起飛這一個進一步的查詢。

0

快速的答案,我把頭去睡覺,所以其未經測試的代碼,但是,總之,你可以使用子查詢..

SELECT PatientID,Date,... 
    FROM myTable 
    WHERE Feature_Of_Interest is present 
    AND patientid in (select PatientID, count(patientid) as counter 
    FROM myTable 
    WHERE Feature_Of_Interest is present group by patientid having counter>1) 

林驚訝你的企圖沒有工作,這聽起來有點像它應該有,除非你沒有說數> 1,因此它可能只是將它們全部歸還。

+0

經過比較這與答案 - 我意識到我的主要問題是同樣的原因,這將無法正常工作 - 你不能計數的東西因爲select是最後處理的(就在Order by之前)。答案的關鍵是HAVING COUNT(*)> 1,顯然你可以做。 – chris

2

試試這個:

WITH qry AS 
(
SELECT a.*, 
COUNT(1) OVER(PARTITION BY PatientID) cnt 
     FROM myTable a 
WHERE Feature_Of_Interest = 'present ' 
) 
SELECT * 
    FROM qry 
WHERE cnt >1 
+0

使用CTE和排序函數優於使用連接和聚合的優點是什麼? –

0

你應該能夠得到你需要使用window function與此類似:

WITH ctePatient AS (
    SELECT PatientID, Date, SUM(1) OVER (PARTITION BY PatientID) Cnt 
    FROM tblPatient 
    WHERE Feature_Of_Interest = 1 
) 
SELECT * 
    FROM ctePatient 
    WHERE Cnt > 1