2010-08-19 88 views
0

我有一個患者表,其中包含以下列:patient_id,obs_id,obs_date。 Obs_id是臨牀觀察(如體重讀數,血壓讀數等)的ID,obs_date是觀察結果的時間。每個病人在不同的日期可以有幾個讀數......等等。目前,我有一個查詢來獲取有obs_id = 1所有患者和它們插入到一個臨時表(有兩列,patient_id,和國旗,我設置爲0這裏):SQL按日期依存關係查詢

insert into temp_table (select patient_id, 0 from patients_table 
where obs_id = 1 group by patient_id having count(*) >= 1) 

我也執行更新聲明的標誌設置爲1,所有患者也有obs_id = 5:

UPDATE temp_table SET flag = 1 WHERE EXISTS ( 
    SELECT patient_id FROM patients_table WHERE obs_id = 5 group by patient_id having count(*)  >=1 
) v WHERE temp_table.patient_id = v.patient_id 

我的問題是:如何修改兩個查詢(不合並,或通過聲明移除組),這樣我可以回答以下問題: 「得到obs_id = 1後obs_id = 5的所有患者」。如果我在每個查詢的選擇中添加min(obs_date)或max(obs_date),然後向第二個查詢添加「AND v.obs_date> temp_table.obs_date」,那麼是否正確?

我不需要通過聲明或組合來移除組的原因是因爲這些查詢是由代碼生成器(來自Web應用程序)生成的,並且我想要修改而不會混淆代碼生成器或重新寫它。

非常感謝,

回答

1

SQL的好處是它可以與集合一起工作。您不需要創建臨時表或獲取所有程序。

你描述的問題(找到誰obs_id 1後已經obs_id 5所有患者),我會像這樣的東西

select distinct p1.patient_id 
from patients_table p1, patients_table p2 
where 
p1.obs_id = 1 and 
p2.obs_id = 5 and 
p2.patient_id = p1.patient_id and 
p2.obs_date > p1.obs_date 

當然開始,它不能幫助你處理你的代碼發電機。有時候,讓事情變得更簡單的工具也可以阻擋。

+0

謝謝,我完全理解。但是,我沒有實現該代碼生成器,我只是修改別人的代碼。改變整體代碼生成策略對我來說不是一種選擇,這就是爲什麼我要爲此付出努力。 – wsb3383 2010-08-20 16:36:43