2011-05-18 28 views
5

Tengo una tabla de valores de laboratorio que me gustaría consultar y obtener la diferencia entre el último valor y el valor más reciente si es> = 0.2. ¿Cómo voy haciendo eso? Aquí está la consulta que tengo hasta ahora. Cualquier ayuda sería apreciada. La base de datos es Oracle 10g. Ver captura de pantalla para más detalles.Diferencia en dos valores de fila de la misma tabla

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

Por curiosidad, ¿tiene que estar en la consulta? ¿Se puede hacer en lo que esté ejecutando la consulta/obteniendo los datos (es decir, un lenguaje de programación o Excel)? Por lo general, es más fácil hacer comparaciones de filas después de ejecutar la consulta, ya que los lenguajes de programación/Excel le permiten hacer cosas como 'row # -1'. –

+0

¿O no entiendo bien, solo desea que la consulta devuelva la diferencia de esos dos valores? –

+2

Lo que constituye "más reciente" y "último". ¿Es antes de la fecha de entrada? –

Respuesta

2

Se debe utilizar la función de anayltical GAL para recuperar un valor de la fila anterior.

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 

Esto no es necesariamente la respuesta que busca pero demuestra cómo puedo calcular una derivar un valor para una columna basada en el valor de una fila anterior.

+0

Esto funciona muy bien. Estoy viendo mi diferencia como DIFF, pero no puedo establecer un criterio donde solo deseo que DIFF sea> = 0.2. No quiero ver un disparador si el valor es <0.2 – Shaji

+0

He editado mi respuesta anterior ... Puede tomar la consulta desde una vista en línea y filtrar los resultados de la columna DIFF de la vista en línea. –

+0

¡Funciona muy bien para lo que quiero hacer con él! ¡Gracias! – Shaji

0

No es muy claro si necesita calcular estos DIFF en todos los LABVALUE para un CÓDIGO dado (por ejemplo, UQN0). Si usted está interesado sólo en los dos últimos como se muestra en la captura de pantalla publicado a continuación, un SQL pura sin ningún tipo de funciones analíticas también puede ser usado cuando:

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; 

Si no hay preocupación por asegurar la compatibilidad con otros servidores de bases de datos, entonces el La función LAG() es claramente el camino a seguir.

Cuestiones relacionadas