标记SQL

时间:2016-03-03 20:57:28

标签: sql netezza

我有一个看起来像这样的表

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。

2 个答案:

答案 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语句来表达它。

我想,有可能更有效的方法来做到这一点。我可能有一些语法错误,因为我对此进行了解决,但我希望你能够理解我正在尝试实现的逻辑。