teradata以经济高效的方式更新表

teradata以经济高效的方式更新表,teradata,Teradata,我有一张有序列号的表。这是一张非常大的桌子,共有1600万行。该表有一个键,它有发生在该键上的事件。每次键更改时,seq_nums在理论上重新启动 在我的原始表中,有一个与每个事件相关的时间戳。为了得到事件的持续时间,我创建了一个滞后列,并从当前事件的时间戳中减去滞后列,得到持续时间。此持续时间在下表中称为时间(单位:分钟) 新表有许多属性 在这种情况下,每个钥匙都是洗车,每个事件都被分配了一个类别,因此在第3行,汽车被提交到一个45分钟的干燥程序 第二行包含23分钟,实际上不是23分钟的清洗

我有一张有序列号的表。这是一张非常大的桌子,共有1600万行。该表有一个键,它有发生在该键上的事件。每次键更改时,seq_nums在理论上重新启动

在我的原始表中,有一个与每个事件相关的时间戳。为了得到事件的持续时间,我创建了一个滞后列,并从当前事件的时间戳中减去滞后列,得到持续时间。此持续时间在下表中称为
时间(单位:分钟)

新表有许多属性

  • 在这种情况下,每个钥匙都是洗车,每个事件都被分配了一个类别,因此在第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
    
如果是上一条记录中的开始类型的
事件,我想将
时间(单位:分钟)
移动到序号1。因此,当我们稍后汇总时,分钟数将正确分配给启动

我可以尝试通过再次创建一个新列来更新该表,这次的
time\u in\u 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

感谢您的帮助

这将根据您的描述切换第一个和第二个值,从而在解释中产生一个统计步骤:

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
现在你可以算数了


但是,在创建电压表时,可能会在上一步中包含逻辑,是否也可以添加此Select?

如果只有序号1,但没有序号2呢?这是一个非常好的问题,并提出了另一个我没有想到的问题,如果序号1中的值不是零呢。我将更新问题以反映这一点。您真的要更新表还是只在Select中进行计算?您的Teradata版本是什么?你能加上预期的结果吗?顺便说一句,1600万行不是一个大表:)嗨@dnoeth。1600万行在我的spool空间中是一个不稳定的表,但您可能在总体方案中是正确的:)。他的尺寸是一个月,但他们想分析12个月。我很乐意在选择中这样做,因为这将是客户使用的答案…我现在将用最终结果更新问题hi@dnoeth,这正是我想要的。非常感谢你的帮助