繁体   English   中英

在SQL中标记连续的天数

[英]Flagging consecutive days in SQL

我有一张桌子,看起来像这样

PATIENT_ID    DATE_NOTED
1             01/01/2015 06:39
1             01/01/2015 17:15
1             01/02/2015 04:30
2             01/01/2015 07:34
2             01/03/2015 18:16

表格中的日期表示喘息记录在患者记录中的时间。 我正在尝试标记至少连续两天出现至少一次喘息的一个实例的患者,因此结果表如下所示:

PATIENT_ID    CONSECUTIVE
1             Yes
2             No

患者1在2015年1月1日和2015年2月1日有喘息记录,因此将其标记为是。 病人2在2015年1月1日和2015年1月3日有喘息记录,因此将其标记为否。 我玩过row_number()有点,但我不知道如何编码。 我正在使用Netezza。

我认为您最好的选择是lag()lead()和聚合:

select patient_id,
       max(case when date_trunc('day', date_noted) = date_trunc('day', prev_date_noted)
                then 1 else 0
           end) as IsConsecutiveFlag
from (select patient_id, date_noted,
             lag(date_noted) over (partition by patient_id order by date_noted) as prev_date_noted
      from t
     ) t
group by patient_id;

这将产生一个0/1值。 如果愿意,您实际上可以用'Yes''No'来代替。

我不确定Netezza,但在SQL Server上我会做类似的事情。

SELECT DISTINCT 
PATIENT_ID
,CASE WHEN OT2.PATIENT_ID IS NULL THEN 'No' ELSE 'Yes' END AS CONSECUTIVE
FROM OBSERVATIONTABLE OT1

LEFT OUTER JOIN OBSERVATIONTABLE OT2
ON OT2.PATIENT_ID = OT1.PATIENT_ID
AND CONVERT(DATE, OT1.DATE_NOTED) = DATEADD(DAY, -1, CONVERT(DATE, OT2.DATE_NOTED))

我自己加入表格,但不是在同一天加入,而是在前一天加入。 如果联接成功,则联接表的patID不会为null,因此我们编写了case语句来表达这一点。

我想可能会有更有效的方法来做到这一点。 自从我徒劳无用以来,我可能会遇到一些语法错误,但是希望您能理解我要实现的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM