[英]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.