gpt4 book ai didi

sql - Postgresql/SQL - 我的日期/时间戳逻辑似乎可靠但产生空值

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

我有一个巨大的表格,里面装满了医院就诊信息。每行对应一次访问。访问/行本身有一个唯一的 ID,但也包含一个人的 ID(患者)以匹配回那个人的特定信息。

我正在构建一个“新患者”序列模型。在这样做时,我需要从表格中删除在设定日期之前进行过一次(或多次)访问的任何患者。我不能只删除那个日期之前的记录,因为那些“忠诚的病人”仍然会有访问信息。

我试图建立一个查找表,其中包含在特定时间之前有过一次或多次就诊的所有患者 ID。然后,我尝试使用此表删除在该设定时间之前进行过一次或多次访问的患者的所有访问信息。

我尝试了以下的多种变体(with statements、delete statements、having statements 等)。每次,最终表都没有值。我已经确认有“新患者”的访问日期仅在设定日期之后。

我的逻辑听起来很可靠,但显然有些地方不对劲。这是我尝试的最后一个命令。任何帮助将不胜感激!

create table client_myvisit_notnew_id as
select patient, admissiondate from client_myvisit_primary_temp1
where admissiondate < '2015-05-30 00:00:00';

create table client_myvisit_primary_temp2 as
select * from client_myvisit_primary_temp1
where patient not in
(select patient from client_myvisit_notnew_id);

最佳答案

not in 是一个非常危险的子查询结构。如果子查询返回的任何值是NULL,则没有任何东西通过过滤器。虽然您可以通过添加 where 子句来解决此问题,但我建议您习惯于使用 not exists 代替:

select mpt.*
from client_myvisit_primary_temp1 mpt
where not exists (select 1
from client_myvisit_notnew_id mni
where mpt.patient = mni.patient
);

这具有大多数人期望的语义。

编辑:

如果您只想要在某个日期之后初次就诊的患者,则使用窗口函数:

select mpt.*
from (select mpt.*,
min(mpt.admission_date) over (partition by mpt.patient) as min_ad
from client_myvisit_primary_temp1
) mpt
where min_ad >= '2015-05-30';

不需要定义多个 View 。

关于sql - Postgresql/SQL - 我的日期/时间戳逻辑似乎可靠但产生空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900206/

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