2011-05-18 128 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()函数显然是要走的路。

相关问题