您好,感谢您的帮助。
我使用MAX数据库进行一些研究。我试图将我的观察结果限制在特定的诊断中,在同一次就诊中没有感兴趣的感染。
这是我到目前为止所做的:
y<-dbGetQuery(conn, "select visit from database
WHERE diag IN ('diag1', 'diag2')group by visit")
~this yields 100 obs
y2<-dbGetQuery(conn, "select visit from database
WHERE diag IN ('diag1', 'diag2' )
and diag NOT IN ('diag3', 'diag4') group by visit")
~this also yields 100 obs
由于我得到相同的号码,我很确定这不符合我想要的方式。我是R和MySql的新手,所以任何建议都会非常感激。
我想我应该解释一下,每次访问都可以进行多次诊断。也许一个例子可以帮助我更好地解释我的问题:
患者:访问:诊断:
1 diag1
1 diag3
b 2 diag2
b 2 diag5
c 3 diag1
因为我只对分析没有诊断为diag3或diag4的diag1或diag2患者的患者感兴趣,我只对我的分析中的患者B和C感兴趣,而不是患者a。
答案 0 :(得分:2)
问题出在您的SQL查询中。查询
select visit from database WHERE diag IN ('diag1', 'diag2') group by visit
与
相同select visit from database WHERE diag IN ('diag1', 'diag2' ) and diag NOT IN ('diag3', 'diag4') group by visit
原因是第二个查询and diag NOT IN ('diag3', 'diag4')
中的附加条件必然为真,因为第一个条件对于两个查询diag IN ('diag1', 'diag2')
都是通用的。换句话说,如果diag
是'diag1'
和'diag2'
之一,则它不能是'diag3'
和'diag4'
中的一个。
修改:查看您的示例数据,我想我了解您的目标。您的第二个查询必须重写如下:
select o.visit from database o where o.diag in ('diag1','diag2') group by o.visit
having not exists (select 1 from database where visit=o.visit and diag in ('diag3','diag4'))
having
子句基本上类似于where
子句,除了在分组(在group by
子句中定义)之后应用已应用,因此您可以对每个组进行整体过滤。在您的情况下,在应用having
子句之前的查询将选择所有访问1,2和3,然后我写的having
条件排除任何涉及诊断的访问'diag3'
或'diag4'
,最终不包括访问1。
注意:我们假设每个visit
号码对于单个patient
是唯一的,例如如果patient='a'
有visit=1
,那么没有其他患者可以拥有visit=1
,因为这样可以了解您的示例数据中的内容,以及您的查询所暗示的内容。如果情况不成立,则patient
和visit
必须将查询(实际上两个查询都必须重写)分组,您必须同时选择patient
您的select子句中的visit
(以获得明确的结果集数据),并且在第二个查询中,having
子句必须与patient
以及{{1}相关联}}