Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据Postgres中的固定时间间隔迭代表?_Sql_Database_Postgresql_Plpgsql - Fatal编程技术网

Sql 如何根据Postgres中的固定时间间隔迭代表?

Sql 如何根据Postgres中的固定时间间隔迭代表?,sql,database,postgresql,plpgsql,Sql,Database,Postgresql,Plpgsql,我想获得所有行,对于这些行,在给定的时间段内每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 A

我想获得所有行,对于这些行,在给定的时间段内每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;
$$
;
下面是实现这些表的代码

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);
实验室的行数为:

ICU的行数为:

为了打印我想要的内容,我必须满足以下条件: SCHEMA.LAB L在LAB.ICU=I.ID上加入SCHEMA.ICU I,并且该L.ITEM=50912和L.CHARTTIMEI.INTIME-间隔“7天”。 从ICU.INTIME值之前的7天开始,我正在寻找每48小时内valuenum增加0.3的情况。因此,当且仅当下一个valuenum在48小时内比上一个值增加了0.3时,我设置了一个标志=1。然后我继续检查接下来48小时间隔的下一个值num,直到LAB.charttime 我要打印的内容如下:

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

这是一个试探性的回答。它确实需要更完整的数据来认真对待。下面是:

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';

在数组CHARTTIME中,我没有看到FOREACH CHARTTIME中的任何数组。这是一个重复:@AdriankAver您建议如何迭代生成的行?@a_horse_和_no_名称我知道,这一个有更准确的解释。do函数无法返回任何内容,因此这是第一个问题,你想对结果做什么?
(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)
(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)
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
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';