Postgres에서 고정 된 시간 간격에 따라 테이블을 어떻게 반복합니까?

Nov 16 2020

주어진 시간 동안 48 시간마다 다음 조건을 만족하는 모든 행을 얻고 싶습니다. 그것들이 모두 참일 때마다 값이 1 인 플래그를 넣습니다.

이것이 내가 지금까지 한 일입니다.

DO
$$ DECLARE i record; CHARTTIME TIMESTAMP; BEGIN FOR i IN SELECT * FROM schema.lab L JOIN schema.icu I ON L.ID = I.ID WHERE L.ITEM = 50912 AND L.CHARTTIME < I.INTIME AND L.CHARTTIME > (I.INTIME - INTERVAL '7 DAY') LOOP CHARTTIME := L.CHARTTIME; FOREACH CHARTTIME IN ARRAY CHARTTIME + INTERVAL '48 HOUR' LOOP IF L.VALUENUM > L.VALUENUM + 0.3 THEN '1'::INTEGER AS FLAG END IF; END LOOP; END LOOP; END; $$
;

내가 얻을 구문 오류 . 하지만이 접근 방식이 올바른지 모르겠습니다.

ERROR:  syntax error at or near "'1'"
LINE 16:     '1'::INTEGER AS FLAG
             ^
SQL state: 42601
Character: 442

다음은 테이블을 구현하는 코드입니다.

CREATE TABLE SCHEMA.LAB (
ID_SUB INTEGER PRIMARY KEY,
ICU INTEGER NOT NULL,
ITEM INTEGER NOT NULL,
CHARTTIME TIMESTAMP NOT NULL,
VALUENUM DOUBLE PRECISION NOT NULL);
CREATE TABLE SCHEMA.ICU (
ID INTEGER PRIMARY KEY,
INTIME TIMESTAMP NOT NULL,
ID_SUB INTEGER);

LAB의 행은 다음과 같습니다.

(1,1,50912,2020-07-17 20:48:00,0.7)
(2,2,50829,2020-07-17 20:48:00,1)
(3,3,50912,2020-07-18 20:03:00,1) 
(4,4,50912,2020-07-20 17:17:00,3.1) 
(1,1,73271,2020-05-17 17:58:00,0.2) 
(2,2,50912,2020-07-17 21:41:00,1.7)

ICU의 행은 다음과 같습니다.

(1,2020-06-17 20:01:00,1)
(2,2020-07-15 00:48:00,2) 
(3,2020-07-20 20:01:00,3) 
(4,2020-07-21 20:03:00,4)

원하는 것을 인쇄하려면 다음 조건을 충족해야 SCHEMA.LAB L JOIN SCHEMA.ICU I ON LAB.ICU=I.ID합니다 L.ITEM = 50912 AND L.CHARTTIME < I.INTIME AND L.CHARTTIME > (I.INTIME - INTERVAL '7 DAY'). 나는의 증가를 찾고 있어요 valuenum0.3 48 시간의 모든 간격 내에서 7 일 전부터 ICU.INTIME의 값입니다. 그래서 다음 valuenum이전 값보다 48h wrt 내에서 0.3 증가하는 경우에만 플래그 = 1을 넣습니다 . 그런 다음 다음 48 시간 간격 동안 다음 valuenum 을 확인합니다 .LAB.charttime < ICU.intime

인쇄하려는 내용은 다음과 같습니다.

LAB.ID_SUB, ICU.ID, LAB.ITEM, LAB.CHARTTIME,        LAB.VALUENUM, ICU.INTIME           FLAG         
   3,        3,     50912,    2020-07-18 20:03:00,  1,            2020-07-20 20:01:00  1
   4,        4,     50912,    2020-07-20 17:17:00,  3.1,          2020-07-21 20:03:00. 1

답변

AdrianKlaver Nov 17 2020 at 17:14

이것은 대답을 찌르는 것입니다. 진지하게 받아들이려면 더 완전한 데이터가 정말로 필요합니다. 여기에 간다 :

SELECT
    *, 1 AS flag
FROM
(SELECT
    *,
    valuenum - LAG(valuenum, 1) OVER(partition by item) AS diff,
    intime - LAG(intime, 1) OVER(partition by item) AS time_diff
FROM
    lab L
JOIN
    icu I
ON
    L.id_sub = I.id
WHERE
    L.item = 50912
AND
    L.charttime < I.intime AND L.charttime > (I.intime - INTERVAL '7 DAY')
) AS select_diff

WHERE
    select_diff.diff > 0.3
AND
    select_diff.time_diff <interval '48 hours';