2011-07-14 92 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