Разница в двух значениях строки одной и той же таблицы - PullRequest
5 голосов
/ 18 мая 2011

У меня есть таблица лабораторных значений, которую я хотел бы запросить и получить разницу между последним значением и самым последним значением, если его> = 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

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Вы должны использовать аналитическую функцию LAG для получения значения в предыдущей строке.

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 голосов
/ 19 мая 2011

Не очень понятно, нужно ли вам вычислять эти DIFF для всех LABVALUE для данного КОДА (например, UQN0).Если вас интересуют только два последних, как показано на опубликованном снимке экрана, то можно также использовать чистый 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 () - это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...