2016-11-30 46 views
0

我正在使用Netezza。在SQL中给连续小时的组赋予共同的价值

比方说,我有一张有两个字段的表格:一个字段是对应于一天中的每个小时的时间戳,另一个是在一小时内是否患有抗酸剂的指示符。该表如下所示:

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 

我最终会想弄清楚的抗酸剂使用的所有连续的时间(所以第一组的开始和结束日期的开始日期和结束日期将是11月23日/ 2016 08:00和2016年11月23日10:00,第二组的开始/结束日期分别为2016年11月23日13:00和11/23/2016 14:00)。我之前用连续天使用extract(从日期开始的时代 - row_number())完成了这一点,但我不知道如何处理小时。

回答

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的抗酸剂的连续组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 
+0

我试过了,但它将一些非连续的小时分组在一起。我会显示我的结果,但它包含机密数据。 – user3642531

+0

我明白你的意思了..所以你只需要将他们分组,如果小时差是1 ..那是对的? –

+0

是的。连续使用抗酸剂的小时数。其他一切都可以为空。 – user3642531