SQL查询:如何选择记录,但如果存在父记录,则选择最近的子记录

时间:2014-10-30 16:46:50

标签: sql ruby-on-rails postgresql activerecord

我有一个复杂的查询,我需要弄清楚,但我在编写查询和子查询方面不够精通。

问题:我需要检索唯一的患者记录,但如果记录的非null master_patient_id,我需要在该master_patient表上进行子查询或连接并查询最新的(created_at desc限制) 1)该主人的儿童患者。

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

现在,我需要显示非重复患者的清单。因此,我需要一个可以从患者记录中获取患者的查询,但查询master_patient表并仅检索与其master_patient相关的最新患者。

患者表具有:id,name,master_patient_id 并且患者属于master_toient但不需要在场。

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

期望的结果:应该是唯一的患者记录,但是找出患者之间是否是唯一的唯一方法是查询master_patient表以查看是否有任何患者属于它,然后只需检索最新病人(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

1 个答案:

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