我有一个看起来像这样的表
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年3月1日记录了喘息,因此他们将被标记为否。我玩了一下row_number(),但我无法弄清楚如何编写代码。我正在使用Netezza。
答案 0 :(得分:1)
我认为您最好的选择是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'
来获取您喜欢的字词。
答案 1 :(得分:0)
我不确定Netezza,但在SQL Server上我会做这样的事情。
127.0.0.1:6379> get akey
"yo mama"
我自己加入了这个桌子,但是我没有在同一天加入,而是在前一天尝试加入。如果连接成功,那么连接表的patID将不为null,因此我们编写一个case语句来表达它。
我想,有可能更有效的方法来做到这一点。我可能有一些语法错误,因为我对此进行了解决,但我希望你能够理解我正在尝试实现的逻辑。