2013-08-05 99 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 –