2012-03-26 105 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' 
相關問題