teradata 以经济高效的方式更新 table
teradata updating a table in a cost effective manner
我有一个 table 有序号。这是一个非常大的 table 1600 万行。 table 有一个键,它有发生在那个键上的事件。每次更改密钥时,seq_nums 理论上都会重新启动。
在最初的 table 中,我有一个与每个事件关联的时间戳。为了获得事件的持续时间,我创建了一个滞后列,并从当前事件的时间戳中减去滞后列,从而得到持续时间。此持续时间在下面的table
中称为time_in_minutes
新的 table 有许多属性
- 在这种情况下,每个钥匙都是洗车,每个事件都被分配了一个类别,因此在第 3 行,汽车被提交干燥程序 45 分钟
- 第二行23分钟,实际上不是洗衣服的23分钟,机器开机用了23分钟
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
。因此,当我们稍后汇总时,分钟数将正确分配给启动
我可以尝试通过再次创建一个新列来更新 table 这次 time_in_mins
的另一个延迟,但这似乎非常昂贵
有谁知道这样做的巧妙方法吗?
编辑 2016 年 10 月 14 日
客户的最终输出如下所示,尽管有点乱
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
感谢您的帮助
这将根据您的描述切换第 1 和第 2 个值,从而在 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 吗?
我有一个 table 有序号。这是一个非常大的 table 1600 万行。 table 有一个键,它有发生在那个键上的事件。每次更改密钥时,seq_nums 理论上都会重新启动。
在最初的 table 中,我有一个与每个事件关联的时间戳。为了获得事件的持续时间,我创建了一个滞后列,并从当前事件的时间戳中减去滞后列,从而得到持续时间。此持续时间在下面的table
中称为time_in_minutes
新的 table 有许多属性
- 在这种情况下,每个钥匙都是洗车,每个事件都被分配了一个类别,因此在第 3 行,汽车被提交干燥程序 45 分钟
- 第二行23分钟,实际上不是洗衣服的23分钟,机器开机用了23分钟
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
。因此,当我们稍后汇总时,分钟数将正确分配给启动
我可以尝试通过再次创建一个新列来更新 table 这次 time_in_mins
的另一个延迟,但这似乎非常昂贵
有谁知道这样做的巧妙方法吗?
编辑 2016 年 10 月 14 日
客户的最终输出如下所示,尽管有点乱
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
感谢您的帮助
这将根据您的描述切换第 1 和第 2 个值,从而在 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 吗?