在 SQL 中连续标记几天
Flagging consecutive days in SQL
我有一个 table 看起来像这样
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
table 中的日期表示患者记录中记录喘息的次数。我正在尝试标记至少有一次至少连续两天喘息记录的患者,因此结果 table 看起来像这样:
PATIENT_ID CONSECUTIVE
1 Yes
2 No
患者 1 在 01/01/2015 和 01/02/2015 记录了喘息,因此他们将被标记为是。患者 2 在 01/01/2015 和 01/03/2015 记录了喘息,因此他们将被标记为否。我玩了一下 row_number() ,但我不知道如何编写代码。我正在使用 Netezza。
我不确定 Netezza,但在 SQL 服务器上我会做这样的事情。
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))
我自己加入了 table,但我没有在同一天加入,而是想在前一天加入。如果加入成功,那么加入的table的patID不会为null,所以我们写一个case语句来表达。
我认为可能有更有效的方法来做到这一点。我可能有一些语法错误,因为我是徒手写的,但我希望你能理解我试图实现的逻辑。
我认为你最好的选择是 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'
来获取单词。
我有一个 table 看起来像这样
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
table 中的日期表示患者记录中记录喘息的次数。我正在尝试标记至少有一次至少连续两天喘息记录的患者,因此结果 table 看起来像这样:
PATIENT_ID CONSECUTIVE
1 Yes
2 No
患者 1 在 01/01/2015 和 01/02/2015 记录了喘息,因此他们将被标记为是。患者 2 在 01/01/2015 和 01/03/2015 记录了喘息,因此他们将被标记为否。我玩了一下 row_number() ,但我不知道如何编写代码。我正在使用 Netezza。
我不确定 Netezza,但在 SQL 服务器上我会做这样的事情。
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))
我自己加入了 table,但我没有在同一天加入,而是想在前一天加入。如果加入成功,那么加入的table的patID不会为null,所以我们写一个case语句来表达。
我认为可能有更有效的方法来做到这一点。我可能有一些语法错误,因为我是徒手写的,但我希望你能理解我试图实现的逻辑。
我认为你最好的选择是 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'
来获取单词。