gpt4 book ai didi

更新表的 PostgreSQL 游标

转载 作者:行者123 更新时间:2023-11-29 13:52:50 30 4
gpt4 key购买 nike

我有一张代表患者体检的表,它有检查 ID 和患者 ID。

我想逐行浏览表格并获取每个患者 ID 并比较其不同的咨询,看看它是否被视为“new_attack”。我正在处理疟疾疾病,我们认为每个在过去 60 天内接受过咨询并且对测试呈阳性的患者都是旧病例并且 new_attack = false,否则 new_attack = 真

但是当我查看表格时我必须考虑 palufalci 列,因为患者可以进行体检但对疟疾测试不呈阳性,在这种情况下 new_attack =假的

创建表的代码如下:

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:

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

现在我想知道如何更新表并获得我想要的结果。

最佳答案

从您的问题看来,您想要用值填充 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 语句:

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 逻辑:

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 表示:如果上一次咨询超过 60 天前或者这是第一次咨询(lag() 函数将为第一次咨询返回 NULL,因为没有前一行),然后 new_attack 值为 false

第二行 palufalci AND old_test 表示:如果在 60 天内有第二次咨询,则 new_attacktrue 只有前一次咨询并且当前测试为 true

关于更新表的 PostgreSQL 游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37700204/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com