2011-05-18 98 views
5

我有一個實驗室值表,我想查詢並獲取最後一個值和最近值之間的差異,如果其>> = 0.2。我如何去做這件事。這是我迄今爲止的查詢。任何幫助,將不勝感激。數據庫是Oracle 10g。細節請參見屏幕截圖。同一表的兩行值的差異

SELECT DISTINCT VISITLAB.DATEOFENTRY, VISITLAB.LABVALUE, VISITLAB.CODE  
FROM(XCX.PATIENTVISIT PATIENTVISIT 
     INNER JOIN 
      XCX.MASTERPATIENT MASTERPATIENT 
     ON (PATIENTVISIT.MASTERPATIENTID = MASTERPATIENT.MASTERPATIENTID)) 
    INNER JOIN 
     XCX.VISITLAB VISITLAB 
    ON (VISITLAB.MASTERPATIENTID = PATIENTVISIT.MASTERPATIENTID) 
     AND (VISITLAB.VISITNUMBER = PATIENTVISIT.VISITNUMBER) 
WHERE  (MASTERPATIENT.MASTERPATIENTID = 'xxxxxxxx') 
    AND (VISITLAB.CODE = 'UQN0') 
    AND (PATIENTVISIT.DISCHARGEDATE IS NULL) 
    AND (PATIENTVISIT.FACILITYCODE = 'x') 

enter image description here

+0

出於好奇,它必須是在查詢?它可以在任何運行查詢/獲取數據(即編程語言或Excel)中完成嗎?在運行查詢後進行行比較通常更容易,因爲編程語言/ Excel允許您執行諸如「row#-1」之類的操作。 – 2011-05-18 19:19:40

+0

還是我誤解了,你只是想查詢返回這兩個值的差異? – 2011-05-18 19:20:36

+2

什麼構成「最近」和「最後」。是否由入境日期? – 2011-05-18 19:22:53

回答

2

您應該使用LAG anayltical函數檢索以前的行中的值。

SELECT * FROM (
SELECT DISTINCT VISITLAB.DATEOFENTRY, VISITLAB.LABVALUE, VISITLAB.CODE, 
    (LAG(VISITLAB.LABVALUE) over (order by VISITLAB.DATEOFENTRY) - VISITLAB.LABVALUE) as DIFF 
FROM(XCX.PATIENTVISIT PATIENTVISIT 
INNER JOIN 
     XCX.MASTERPATIENT MASTERPATIENT 
     ON (PATIENTVISIT.MASTERPATIENTID = MASTERPATIENT.MASTERPATIENTID)) 
INNER JOIN 
     XCX.VISITLAB VISITLAB 
     ON (VISITLAB.MASTERPATIENTID = PATIENTVISIT.MASTERPATIENTID) 
     AND (VISITLAB.VISITNUMBER = PATIENTVISIT.VISITNUMBER) 
WHERE (MASTERPATIENT.MASTERPATIENTID = 'xxxxxxxx') 
AND (VISITLAB.CODE = 'UQN0') 
AND (PATIENTVISIT.DISCHARGEDATE IS NULL) 
AND (PATIENTVISIT.FACILITYCODE = 'x') 
) INLINEVIEW 
WHERE DIFF < .2 

這不一定是你正在尋找的答案,但它說明了我如何計算推導基於先前行的值的列的值。

+0

這很好。我看到我的差異爲DIFF,但我無法設置一個標準,只要DIFF> = 0.2就可以。我不想看到一個觸發器,如果​​值是<0.2 – Shaji 2011-05-18 19:48:20

+0

我編輯了我的答案上面...您可以從內聯視圖中查詢並過濾內聯視圖的DIFF列的結果。 – 2011-05-18 22:26:32

+0

適用於我想用它做的事!謝謝! – Shaji 2011-05-20 22:10:24

0

如果您需要計算給定代碼(例如UQN0)的所有LABVALUE中的DIFF,目前還不十分清楚。如果你有興趣只是在張貼的截圖顯示,然後沒有任何分析功能的純SQL,也可以使用近兩年的:

create table lab (
    code varchar2(10), 
    date_of_entry date, 
    lab_value number(10,2) 
); 
insert into lab values('UQN0', trunc(sysdate) - 3, 0.98); 
insert into lab values('UQN0', trunc(sysdate) - 2, 0.85); 
insert into lab values('UQN0', trunc(sysdate) - 1, 0.90); 
insert into lab values('UQN0', trunc(sysdate), 0.64); 
commit; 
select * from lab; 

with last_results as (
    select t.* from (
    select * from lab where code = 'UQN0' 
    order by date_of_entry desc 
) t where rownum <= 2 
) 
select t1.* 
from last_results t1, last_results t2 
    where t1.lab_value - t2.lab_value >= 0.2; 

如果有爲了保證與其它數據庫服務器的兼容性,則不用擔心LAG()函數顯然是要走的路。

相關問題