Oracle nique,那么每个(pId,hdId)对可以获得多个记录。我相信最初的查询也会有同样的问题,这是对EMR(病历)系统的查询。pId是人形的,hdId识别医学观察(血压、脉搏、LDL等),因此,您不必担心(太多)重复pId/hdId/日期-每个文档都有一个
Oracle nique,那么每个(pId,hdId)对可以获得多个记录。我相信最初的查询也会有同样的问题,这是对EMR(病历)系统的查询。pId是人形的,hdId识别医学观察(血压、脉搏、LDL等),因此,您不必担心(太多)重复pId/hdId/日期-每个文档都有一个,oracle,oracle10g,subquery,sql,Oracle,Oracle10g,Subquery,Sql,nique,那么每个(pId,hdId)对可以获得多个记录。我相信最初的查询也会有同样的问题,这是对EMR(病历)系统的查询。pId是人形的,hdId识别医学观察(血压、脉搏、LDL等),因此,您不必担心(太多)重复pId/hdId/日期-每个文档都有一个值。但我认为这不起作用-您可能需要两天的观察(一次就诊的BMI百分位,另一次就诊的哮喘监测)。除非我遗漏了一些关于相关性的东西,这总是有可能的……相关性是在所有三列上进行的。基本查询将为一个人从ml.Obs检索所有行。然后,子查询选择obsda
nique,那么每个(pId,hdId)对可以获得多个记录。我相信最初的查询也会有同样的问题,这是对EMR(病历)系统的查询。pId是人形的,hdId识别医学观察(血压、脉搏、LDL等),因此,您不必担心(太多)重复pId/hdId/日期-每个文档都有一个值。但我认为这不起作用-您可能需要两天的观察(一次就诊的BMI百分位,另一次就诊的哮喘监测)。除非我遗漏了一些关于相关性的东西,这总是有可能的……相关性是在所有三列上进行的。基本查询将为一个人从ml.Obs检索所有行。然后,子查询选择obsdate为给定pId hdId的max()的行。请参阅David Aldridge的答案,了解其中的变化(性能可能会有所不同)。您可能希望重构查询,而不仅仅是修复您遇到的语法问题。考虑在你试图完成的问题上加上澄清。@戴维-“学究”:-艾伦-我只是不确定我应该在多大程度上讨论这个系统的内部。通常,我会使用一个内置视图,按pID/hdID进行分组,以获取最新的观察结果,但如果是在2009年,而您查询的是2008年,则该视图将失败。您可能希望重构查询,而不仅仅是修复您遇到的这个语法问题。考虑在你试图完成的问题上加上澄清。@戴维-“学究”:-艾伦-我只是不确定我应该在多大程度上讨论这个系统的内部。通常,我会使用一个内置视图,按pID/hdID进行分组,以获得最新的观察结果——但如果是在2009年,而您查询的是2008年,则该视图将失败。此版本的解释计划比我提出的版本要好一些,而且感觉也更快。我以前没碰到过这些--谢谢!您刚刚向我演示了如何使用分区方式,并解决了我的问题。这个版本的解释计划比我提出的计划要好一点,而且感觉也更快。我以前没碰到过这些--谢谢!您刚刚向我演示了如何使用分区,并解决了我的问题。
FROM ml.Person Person
JOIN ml.Obs ON Person.pID = Obs.pId
JOIN (SELECT ObsMax2.pId, ObsMax2.hdId
, MAX(ObsMax2.obsDate) as maxDate
FROM ml.Obs ObsMax2
WHERE ObsMax2.pId = Obs.pId
AND ObsMax2.obsDate < {?EndDate}
GROUP BY ObsMax2.pId, ObsMax2.hdId) ObsMax
ON Obs.pId = ObsMax.pId
AND Obs.hdId = ObsMax.hdId
AND Obs.obsDate = ObsMax.maxDate
select ...
from
ml.Person Person
join ml.Obs on Person.PID = Obs.pId
where Obs.obsDate = (
select max(obsDate)
from ml.Obs Obs2
where Obs2.pId = Obs.pId
and obs2.hdId = Obs.hdId
and Obs2.obsDate < {EndDate})
select ...
from (
SELECT pId,
hdId,
obsDate
MAX(obsDate) over (partition by pId, hdId) maxDate
FROM ml.Obs
WHERE obsDate < {?EndDate}
)
where obsDate = maxDate
/