2016-06-08 2 views
1

환자의 건강 검진을 나타내는 테이블이 있는데, 검사 ID와 환자 ID가 있습니다.테이블을 업데이트하는 PostgreSQL 커서

행별로 표를 실행하고 모든 환자 ID를 가져 와서 다른 상담을 비교하여 "new_attack"으로 간주되는지 확인하고 싶습니다. 저는 말라리아 질병을 다루고 있으며, 지난 60 일 동안 상담을 받았고 구시대 검사로 양성 반응을 보인 모든 환자와 new_attack = false, 그렇지 않은 경우 new_attack = true을 고려합니다.

환자가 건강 검진을받을 수는 있지만 말라리아 검사에 양성 반응을 보이지 않으므로이 테이블을 통과 할 때는 palufalci 열을 고려해야합니다.이 경우에는 new_attack = false입니다.

CREATE TABLE public.tbl_diagnostiques_guy (
    id integer NOT NULL DEFAULT nextval('tbl_diagnostiques_guy_id_seq'::regclass), 
    dateconsultation date, 
    numeropatient character varying(13), 
    palufalci boolean, 
    new_attack boolean 
); 

나는 모든 환자의 datediff 2 사이의 건강 진단 계산이 쿼리를 사용 : 여기

테이블 생성하는 코드입니다

SELECT id, numeropatient, palufalci, 
    dateconsultation, NextDate, 
    date(NextDate) - date(dateconsultation) as Diff, new_attack 
FROM (
    SELECT id, numeropatient, palufalci, dateconsultation, new_attack, 
     (SELECT MIN(dateconsultation) 
      FROM tbl_diagnostiques_guy T2 
      WHERE T2.numeropatient = T1.numeropatient 
      AND  T2.dateconsultation > T1.dateconsultation 
     ) AS NextDate 
    FROM tbl_diagnostiques_guy T1) AS T 
WHERE NextDate IS NOT NULL AND (date(NextDate) - date(dateconsultation) < 60) 
GROUP BY id, numeropatient, palufalci, dateconsultation, NextDate, new_attack 
ORDER BY numeropatient DESC; 

을하고 그 결과는 다음과 같습니다 here

이제 테이블을 업데이트하고 원하는 결과를 얻는 방법을 알고 싶습니다.

+0

테이블'tbl_diagnostiques_guy'에 'palufalci' 또는'vivax' 열이 있습니까? 쿼리는 전자를 제안하는 것처럼 보이지만 테이블 정의에는 후자가 있습니다. * 질문을 편집 (질문의 태그 아래 링크 참조) 한 다음 그래픽 링크 대신 텍스트 버전의 출력 (PgAdminIII 파일로 내보내기)을 추가하십시오. – Patrick

+0

안녕하세요, 먼저 내 게시물을 편집 해 주셔서 감사드립니다. 팔 푸르 치 나는 질문을 편집했습니다. –

+0

안녕하세요. 안녕하세요. 안녕하세요. 아래 내 대답을 참조하십시오. 당신의 데이터베이스와 연구에 행운을 빈다, 나는 두 번 나 말라리아를 먹었으므로 좋은 일을 계속 지켜라! – Patrick

답변

0

new_attack 열을 값으로 채우려는 질문에서 나타납니다. 당신의 논리가 new_attack 값이 누락 보인다 설정할 수 있지만 - - 그건 꽤 쉽게 쿼리를 수행하지만 lag() window function 사용하여 더 우아한 형태로 실제로 존재 : 당신이 무엇을 기대한다는 것을 확인하기 위해 그 진술

SELECT id, numeropatient, palufalci, dateconsultation, 
     CASE WHEN days IS NULL OR days > 60 THEN false 
     ELSE palufalci AND old_test 
     END AS new_attack 
FROM (
    SELECT id, numeropatient, palufalci, lag(palufalci) OVER w AS old_test, 
     dateconsultation, dateconsultation - lag(dateconsultation) OVER w AS days, 
    FROM tbl_diagnostiques_guy 
    WINDOW w AS (PARTITION BY numeropatient ORDER BY dateconsultation)) sub; 

실행 . 만족하는 경우에, 당신은 쉽게 UPDATE 문에 전체를 재 작업 할 수 있습니다

CASE WHEN days IS NULL OR days > 60 THEN false 
ELSE palufalci AND old_test 
END 

첫 번째 줄 WHEN days IS NULL OR days > 60 THEN false 의미 :

UPDATE tbl_diagnostiques_guy t 
SET new_attack = 
     CASE WHEN days IS NULL OR days > 60 THEN false 
     ELSE palufalci AND old_test 
     END 
FROM (
    SELECT id, numeropatient, palufalci, lag(palufalci) OVER w AS old_test, 
     dateconsultation, dateconsultation - lag(dateconsultation) OVER w AS days, 
    FROM tbl_diagnostiques_guy 
    WINDOW w AS (PARTITION BY numeropatient ORDER BY dateconsultation)) sub 
WHERE t.id = sub.id; -- add other join conditions as required 

이의 좀 더 상세하게 new_attack 논리를 살펴 보자하는 경우 이전 상담이 60 일 이상 지난 경우 또는이 상담이 첫 번째 상담 인 경우 (lag() 함수는 첫 번째 상담에 대해 NULL을 반환합니다), new_attack 값은 false입니다.

두번째 라인 palufalci AND old_test 수단 : 60 일 이내에 제 상담 후 있었다면 new_attack 모두 이전과 현재의 시험을 true 경우에만 true이다.

+0

귀하의 답변은 내가 찾는 솔루션의 70 %를 제공합니다.저는 새로운 상담이있을 경우 new_attack = true 인 이전 상담과 비교해야한다는 점을 언급하지 않았기 때문에 제 잘못이라고 생각합니다. 먼저 모든 환자의 모든 첫 상담을하고 new_attack = true로 설정하면 이후의 상담은 new_attack = true와 비교해야합니다. –

+0

다른 규칙을 추가 한 후 올바르게 작동합니다. 감사합니다. 패트릭 –

관련 문제