2014-10-30 91 views
3

我有一个复杂的查询,我需要弄清楚,但我在编写查询和子查询方面不够精通。SQL查询:如何选择记录,但是如果存在父记录,请选择它的最新子项

问题:我需要检索唯一的病人记录,但如果记录有一个非空master_patient_id,我需要子查询或加入对master_patient表,查询最近的(created_at DESC LIMIT 1)儿童患者该master_patient。

原因是我们的系统将为同一患者创建一个新的患者记录,如果他们被重新接收到同一个设施。在创建给定患者的第二条记录时,我们还创建了一个master_patient记录,以将两个患者记录与它关联,以便系统可以知道他们是同一患者。

现在,我需要显示非重复患者的列表。所以我需要有一个能够从患者记录中获取患者的查询,但需要查询master_patient表并只检索与其master_patient关联的最新患者。

耐心表具有:ID,名称master_patient_id 和患者belongs_to的master_patient但是存在不是必需的。

主患者表中只有一个id和has_many患者。

期望的结果:应该是唯一的病历,但发现如果患者本身中是独一无二的唯一方法是查询master_patient表,看是否有患者belong_to它,然后只检索最新的患者(儿master_patient)。

我不能根据master_patient查询我的查询,因为那些只有1条记录的患者不存在。我应该使用某种类型的连接或子查询吗?

更新:感谢@τεκ我能够调整自己的查询中Postgres的工作:

更新2: 1更微小的调整来查询,以使其更短,纠正空ID为返回:

SELECT MAX(patients.id) as id, * 
FROM "patients" 
JOIN (
    SELECT MAX(created_at) AS created_at, 
     patient_master_id, 
     COALESCE(patient_master_id, id) pm_id 
    FROM patients 
    GROUP BY patient_master_id, 
     COALESCE(patient_master_id, id) 
) s 
ON (s.pm_id = patients.id or s.patient_master_id = patients.patient_master_id) 
AND s.created_at = patients.created_at 
GROUP BY patients.id, s.created_at, s.patient_master_id, s.pm_id 

回答

2
select max(id) as id from patient p 
join (select 
    max(created_at) as created_at, 
    master_patient_id, 
    case when master_patient_id is null then id else null end as id 
    from patient 
    group by master_patient_id, case when master_patient_id is null then id else null end 
) s on (s.id = p.id or s.master_patient_id = p.master_patient_id) and s.created_at = p.created_at 

有可能是一个简单的,Postgres的特定的方式来做到这一点,但我不知道的Postgres。在T-SQL中是cross apply

+0

这看起来像是有效的。我现在正在运行一些测试。我会尽快回复。谢谢! – DiegoSalazar 2014-10-30 17:48:58