SQL按日期依赖性查询

时间:2010-08-19 18:40:28

标签: sql oracle aggregate-functions

我有一张患者表,其中包含以下列:patient_id,obs_id,obs_date。 Obs_id是临床观察的ID(例如体重读数,血压读数等),obs_date是观察时的观察结果。每个患者可以在不同的日期等几个读数。目前我有一个查询,让所有患有obs_id = 1的患者并将它们插入临时表(有两列,patient_id和flag,我在这里设置为0):

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

我还执行一个更新语句,为所有患有obs_id = 5的患者设置标志为1:

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

这是我的问题:如何修改两个查询(不合并或删除group by语句),以便我可以回答以下问题: “让所有患者在obs_id = 1后患有obs_id = 5”。如果我在每个查询的选择中添加min(obs_date)或max(obs_date),然后将“AND v.obs_date> temp_table.obs_date”添加到第二个,那是正确的吗?

我不需要删除group by语句或组合的原因是因为这些查询是由代码生成器(来自Web应用程序)生成的,并且我想在不弄乱代码生成器或重新生成的情况下进行修改写它。

非常感谢,

1 个答案:

答案 0 :(得分: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

当然,这对您处理代码生成器没有帮助。有时,使事情变得更容易的工具也会妨碍。