我有大量的数据,有很多列。
这就是我需要的:
有时,多条记录应显示为一条记录(至少持续时间)。 所以这意味着,如果:
这些记录的持续时间应加在一起。
可能是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很容易。
有什么想法吗?
答案 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])