为SQL中的连续小时组赋予共同的价值

时间:2016-11-30 03:48:45

标签: sql netezza

我正在使用Netezza。

假设我有一个包含两个字段的表:一个字段是对应于当天每小时的时间戳,另一个字段是患者是否在一小时内服用抗酸剂的指示。该表如下所示:

Timestamp           Antacid?
11/23/2016 08:00          1
11/23/2016 09:00          1
11/23/2016 10:00          1
11/23/2016 11:00          0
11/23/2016 12:00          0
11/23/2016 13:00          1
11/23/2016 14:00          1
11/23/2016 15:00          0

有没有办法为每组连续小时间隔分配一个公共分区值?像这样......

Timestamp           Antacid?      Group
11/23/2016 08:00          1           1
11/23/2016 09:00          1           1
11/23/2016 10:00          1           1
11/23/2016 11:00          0        NULL
11/23/2016 12:00          0        NULL
11/23/2016 13:00          1           2
11/23/2016 14:00          1           2
11/23/2016 15:00          0        NULL

我最终想知道所有连续使用抗酸剂的开始日期和结束日期(因此第一组的开始和结束日期将是2016年11月23日08:00和2016年11月23日分别为10:00,第二组的开始/结束日期分别为11/23/2016 13:00和11/23/2016 14:00。我之前连续几天使用提取物(来自日期的时期 - row_number()),但我不确定如何处理小时数。

1 个答案:

答案 0 :(得分:1)

我认为必须为每位患者做这件事(这里的查询中为id)。你可以使用

select id,antacid,min(dt) startdate,max(dt) enddate from (
select t.*,
-row_number() over(partition by id,antacid order by dt) 
+ row_number() over(partition by id order by dt) grp
from t
) x
where antacid = 1
group by id,antacid,grp
order by 1,3

内部查询为您提供针对给定患者ID的antacid的连续组0和1。因为您只需要antacid = 1的开始日期和结束日期,所以可以使用where子句进行过滤。

如果必须每天都按日期添加分区。

编辑:仅当当前行与下一行之间的差异为一小时时才对行进行分组。

select id,antacid,min(dt) startdate,max(dt) enddate from (
select t.*,
--change dateadd as per Netezza functions so you add -row_number hours
dateadd(hour,-row_number() over(partition by id,antacid order by dt),dt) grp
from t
) x
where antacid = 1
group by id,antacid,grp
order by 1,3