SpotFire:参考两个(或多个)连续行添加计算列

时间:2019-06-07 13:13:52

标签: spotfire

我有大量的数据,有很多列。

  • 第一列是“安装”。
  • 第二列是“次安装”
  • 第三列是故障的开始日期/时间
  • 第4列是故障的结束日期/时间
  • 第五列是故障持续时间

这就是我需要的:

有时,多条记录应显示为一条记录(至少持续时间)。 所以这意味着,如果:

  • 以下两个记录的安装是相同的,并且来自相同的记录
  • 以下两个记录的子安装是相同的
  • 第二条记录的开始日期/时间在结束日期/时间+第一条记录的5分钟之内

这些记录的持续时间应加在一起。

可能是2条记录应该是1条记录,也可能是连续8条记录应该是1条记录。

Ins   Sub-In   Begin         End            Dur   Tot Dur  
x     1        1-1-15 00:00  1-1-15 00:03   3       11  
x     1        1-1-15 00:04  1-1-15 00:12   8       11  
x     1        1-1-15 00:18  1-1-15 00:22   4       4  
z     2        1-1-15 01:00  1-1-15 01:06   6       35  
z     2        1-1-15 01:07  1-1-15 01:16   9       35  
z     2        1-1-15 01:18  1-1-15 01:38   20      35   
z     2        1-1-15 01:45  1-1-15 01:49   4       9  
z     2        1-1-15 01:49  1-1-15 01:54   5       9  

在上面的示例中,Tot Dur列是我要实现的列。

您可以看到第1条2条记录具有相同的Inst(x)和Sub-Inst(1),并且第二条记录的开始日期/时间在结束日期/时间+第一条记录的5分钟以内。 因此,在Tot Dur:11(3 + 8)列中,两个记录的持续时间都被添加并显示。

记录4-> 9都具有相同的Inst(z)和Sub-Inst(2),但是在记录6和7之间,开始日期和结束日期/时间相差超过5分钟(01:45-01:38 = 7分钟)。

因为记录4-> 6的开始和结束日期/时间都在5分钟内,所以这些都是1条记录,并且它们的持续时间相加为:35(6 + 9 + 20)。

试图将OVER函数与Intersect一起使用,但是它不起作用。 我认为解决方案在于这些功能,但无法获得正确的公式。

如果可以通过添加更多列来完成解决方案,那么1个计算列也非常好。

更新 更新 更新 更新

我将其范围缩小到以下范围。

Ins   Sub-In   Begin         End            Dur   Same  Tot Dur  
x     1        1-1-15 00:00  1-1-15 00:03   3    8142    11  
x     1        1-1-15 00:04  1-1-15 00:12   8    Yes     11  
x     1        1-1-15 00:18  1-1-15 00:22   4    No      4  
z     2        1-1-15 01:00  1-1-15 01:06   6    9843    35  
z     2        1-1-15 01:07  1-1-15 01:16   9    Yes     35  
z     2        1-1-15 01:18  1-1-15 01:38   20   Yes     35   
z     2        1-1-15 01:45  1-1-15 01:49   4    6542    9  
z     2        1-1-15 01:49  1-1-15 01:54   5    Yes     9  

现在唯一要做的是一个新的计算行,如果在Same列中为yes,则将前一行的RowId(8142、9843、6542)放入。

然后计算Tot Dur很容易。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定如何处理更新中的“相同”列。 我同意这个想法是,我们找到了一种方法来对应该聚集的行进行分组。我尝试了一个解决方案,但确实花了我一些计算列。也许有帮助,并且/或者您可以将其与更新中的洞察力相结合。

首先,创建一个行ID:我们需要它来枚举行

[ID]: RowId()

然后创建一个连接Ins和Sub-In的组:我们需要它来确定要在哪里重新开始累积日期差

[group]:  Concatenate([Ins],[Sub-In])

然后创建一列,该列给出上一行的末尾;如果没有上一行,则在当前行的末尾增加10分钟(因此我们以后可以忽略它):

[EndPrevious]:   SN(Min([End]) over (Previous([End])),DateAdd(“mi”,10,[End]))

这时,我们可以创建行总和的运行标识符,这些行总和可以在5分钟内开始和结束:

[startGroup]: Sum(If(DateDiff('mi',[EndPrevious],[Begin])<=5,0,1)) over 
(intersect(Allprevious([ID]),[group])) + DenseRank([group])

如果If(DateDiff('mi',[EndPrevious],[Begin])<= 5,0,1)在0时(如果我们仍在同一个起始组中),而在1时(如果我们正在开始新的)一。为了清楚起见,可以将其设置为单独的列,但我想节省列数。

最后,计算[startGroup]中的持续时间之和:

[TotDur2]:  Sum([Dur]) over ([startGroup])