2013-08-05 100 views
0

我需要获得在特定时间范围内已经出院的患者的积极数量,但这里有个诀窍。在这个表格中,病人可以不止一次出现,我们的系统使用基于情节的系统。来自查询的对照结果

喜欢(图片1)。

select 

p.patient_id, 
p.episode_id, 
p.case_status, 
p.case_substatus, 
p.episode_close_date 

from patient p 

enter image description here

我不需要患者在这两个查询的的展现出来。

select * from patient p 
where p.case_status = 'a' 

-

select * from patient p 
where (p.episode_close_date between '2013-01-01 00:00:00.000' and '2013-06-01 00:00:00.000') and p.case_status = 'i' 

我想,什么是做到这一点的最佳途径,将是该最高p.episode_id = 'I'。任何想法如何做到这一点?

在此先感谢。

回答

1

您可以使用聚合和having子句进行此操作。该having条款计算相互匹配条件的行数 - 你想,因为你想都没有返回行中的值设置为0

select patient_id 
from patient p 
group by patient_id 
having sum(case when p.case_status = 'a' then 1 else 0 end) = 0 and 
     sum(case when (p.episode_close_date between '2013-01-01 00:00:00.000' and '2013-06-01 00:00:00.000') and 
        p.case_status = 'i' 
       then 1 else 0 
      end) = 0; 

基本上,在动了你的前两个查询逻辑插入到having的单独条款中,对与每个条件匹配的行进行计数。

编辑:

这里是你怎么看最后一集为每一个病人:

select p.* 
from (select p.*, 
      max(episode_id) over (partition by patient_id) as maxei 
     from patients p 
    ) p 
where episode_id = maxei; 

您可能还可以用你的逻辑用这个,但我不知道的在状态和查询中的日期之间相互作用。

+0

嘿戈登谢谢你的帖子,所以这将上升到任何插曲号码正确?它没有出现,我可以让它显示额外的信息。我不能将其添加到其他列中查看吗? –

+0

我认为这是我需要的。让我研究一下,看看我能否得到我需要的结果。非常感谢你的帮助。 –

+0

我在另一个查询中使用此代码,我正在处理一个问题。有什么方法可以谈论它吗?非常感谢你为这个代码。自从你在一年前把它交给我以来,我一直都在使用它。 http://stackoverflow.com/questions/27806899/including-null-results-after-join –