2012-03-26 123 views
2

我试图从观察表获取最新数据。为了确保获得最新值,我在值的“创建日期/时间”上使用了最大值函数。为了将我的结果缩小到特定患者,我必须将此表加入患者表
我想发送一张桌子的视觉,但不能,因为这是我的第一篇文章。无论如何,看看你是否可以在没有桌子设计的情况下搞清楚。使用MAX函数获取基于“创建日期/时间”的最新值

我执行以下操作:

select o.FindingName, o.Value, o.CreationTime   
from dbo.HObservation o inner join dbo.HPatient p 
    on p.ObjectID = o.Patient_oid,    
    (select max(CreationTime) as CT, value 
     from dbo.HObservation group by Value) b 
     Where o.Value = b.Value and 
     o.CreationTime = b.CT 
        and o.FindingAbbr in ('Wt', 'A_BM', 'A_Last BM Date', 'A_BP', 
     'A_Pulse', 'A_Temperature', 'A_Respirations', 
     'A_R_SurgDate', 'A_R_ChRvORTm', 'A_R_OpPOPPreced' 
     , 'A_R_FNSNN', 'A_R_WOUNDNN') 
       and p.ObjectID = 2227268 

我的结果似乎显示上述上表中列出的所有数据。 我尝试了多种场景,但现在我的大脑有点油炸了,我甚至不记得它们。有人知道我在这里做错了吗? 另外,正如您可能已经注意到的,我试图将我的“查找姓名”列表仅限为12个值。只是为了让它更有效率,但没有帮助。 任何想法!! ??

回答

0

HObservation表将为每个患者记录/值字段。

您的查询

(select max(CreationTime) as CT, value   from dbo.HObservation group by Value) 

你只值取时间的最大值。如果你的餐桌有多个患者,那么它只会列出最近更新的那些患者的价值的最大值。

可以包括与值一起Patient_oid列,获得最大的(创建时间)

0

你留下了一些细节你的问题:

  1. 其中MS SQL Server版本所使用。我假定SQL2005或更新的版本,以便可以使用CTE和排名函数ROW_NUMBER()。
  2. 无论您是希望给定患者的每次观察的最新值,还是希望在最近一次观察到的患者的所有值都对患者进行了任何观察。我假设前者。

该查询应该给你的总体思路:

with WindowedObservation as (
    select Patient_oid, FindingAbbr, Value, CreationTime, 
     row_number() over (
      partition by Patient_oid, FindingAbbr 
      order by CreationTime desc 
     ) as ROWNUM 
    from HObservation 
) 
select * 
from WindowedObservation 
join HPatient 
on HPatient.ObjectId = WindowedObservation.Patient_oid 
where WindowedObservation.ROWNUM = 1 

注释掉WHERE子句来看看是如何被使用ROW_NUMBER()。

下面是示例数据少量来测试:

CREATE TABLE HPatient (
    ObjectId int, 
    Name nvarchar(50) 
) 

insert into HPatient(ObjectId, Name) 
select 1,'Patient1' 
union all select 2, 'Patient2' 
union all select 3,'Patient3' 

CREATE TABLE HObservation (
    Patient_oid int, 
    FindingAbbr nvarchar(50), 
    Value float, 
    CreationTime datetime 
) 

insert into HObservation(Patient_oid, FindingAbbr, Value, CreationTime) 
select 1, 'A_Pulse', 64, '2012-01-01' 
union all select 1, 'A_Pulse', 73, '2012-01-02' 
union all select 1, 'A_Pulse', 59, '2012-01-03' 
union all select 1, 'A_Temperature', 98.6, '2012-01-01' 
union all select 1, 'A_Temperature', 98.1, '2012-01-02' 
union all select 1, 'A_Temperature', 90.2, '2012-01-03' 
union all select 2, 'A_Pulse', 61, '2012-01-03' 
union all select 2, 'A_Pulse', 67, '2012-01-04' 
union all select 2, 'A_Pulse', 64, '2012-01-05' 
union all select 2, 'A_Temperature', 100.2, '2012-01-03' 
union all select 2, 'A_Temperature', 98.6, '2012-01-04' 
union all select 2, 'A_Temperature', 98.9, '2012-01-05' 
union all select 3, 'A_Pulse', 80, '2012-02-01' 
union all select 3, 'A_Temperature', 98.2, '2012-02-01' 
union all select 3, 'Wt', 180, '2012-02-01' 
union all select 3, 'A_Pulse', 84, '2012-02-02' 
union all select 3, 'A_Respirations', 16, '2012-02-03' 
相关问题