我有一个包含序列号的表。它是一个非常大的表,1600万行给予或采取。该表有一个键,它具有发生在该键上的事件。每次密钥更改时,seq_nums都会在理论上重新启动。
在原始表格中,我有一个与每个事件相关的时间戳。为了获得事件的持续时间,我创建了一个滞后列,并从当前事件的时间戳中减去滞后列,给出了持续时间。此持续时间在下表中称为time_in_minutes
新表有许多属性
在ID号144中,缺少启动机器的记录。这似乎在数据集中很普遍
key Event time in mins seq_num
1 Start 0 1
1 Wash 23 2
1 Dry 45 3
1 Wash 56 4
1 Wash 78 5
1 Boil 20 6
1 ShutDown 11 7
2 Start 0 1
2 Wash 11 2
2 Dry 12 3
-------------------------------------------
144 Wash 0 1
144 Wash 11 2
144 Dry 12 3
我想将time_in_mins
移到seq_num 1,如果它是前一条记录中 Start 类型的Event
。因此,当我们稍后聚合时,会将分钟正确分配给启动
我可以尝试通过再次创建一个新列来更新表,这次使用time_in_mins
的另一个延迟,但这似乎相当昂贵
有谁知道这样做的聪明方法?
修改 2016/10/10
客户的最终输出如下所示,尽管略有乱序
key event total minutes
1 Start 23
1 Boil 20
1 Dry 45
1 Wash 134
1 ShutDown 11
2 Start 11
2 Dry 12
2 Wash 0
感谢您的帮助
答案 0 :(得分:1)
这将根据您的描述切换第一个和第二个值,从而在Explain中产生一个STAT步骤:
SELECT key, seq_num, event,
CASE
WHEN seq_num = 1
AND Event = 'Start'
THEN Min(CASE WHEN seq_num = 2 THEN time_in_mins ELSE 0 END)
Over (PARTITION BY key)
WHEN seq_num = 2
AND Min(CASE WHEN seq_num = 1 THEN Event END)
Over (PARTITION BY key) = 'Start' THEN 0
ELSE time_in_mins
END AS new_time_in_mins
FROM tab
现在你可以做到这一点。
但是,当你创建Voltile Table时,可能会在上一步中包含逻辑,你也可以添加这个Select吗?