teradata以经济有效的方式更新表格

时间:2016-10-13 16:11:20

标签: teradata

我有一个包含序列号的表。它是一个非常大的表,1600万行给予或采取。该表有一个键,它具有发生在该键上的事件。每次密钥更改时,seq_nums都会在理论上重新启动。

在原始表格中,我有一个与每个事件相关的时间戳。为了获得事件的持续时间,我创建了一个滞后列,并从当前事件的时间戳中减去滞后列,给出了持续时间。此持续时间在下表中称为time_in_minutes

新表有许多属性

  • 在这种情况下,每个钥匙都是洗车,每个事件都被指定一个类别,所以在第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。因此,当我们稍后聚合时,会将分钟正确分配给启动

我可以尝试通过再次创建一个新列来更新表,这次使用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

感谢您的帮助

1 个答案:

答案 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吗?