【问题标题】:calculation the difference for same column for the specific rows in Spotfire计算 Spotfire 中特定行的同一列的差异
【发布时间】:2017-02-01 09:32:16
【问题描述】:

我在使用 Spotfire 中的计算列计算行的差异时遇到问题。

我想知道是否可以创建一个计算列来计算当前行与具有不同属性的下一行之间的差异。 示例表可能是这样的:

结果可能是这样的:

基本行是:

  1. type=1时,计算其当前与其下一个最近type=0的行之间的差,然后加上结果到一个新的计算列。
  2. 顺便说一句,VALUE 总是在增加:)
  3. 例如,对于第一个结果2,当前值为20,下一行是与0最近的类型,下一行的值为22,则结果为2
  4. 但是对于下一个 type=1,当前值为 25,其最近的 type=0 在第六行,所以结果可能是 29-25=4

我尝试过的方法:

  1. 我添加了一个新的 RowID 列
  2. 然后试试代码:

    if([type]=1),[value] - Sum([value]) OVER (PreviousPeriod([RowID])),null)
    

但它只是显示了类型 1、无类型 1 和类型 0 之间的区别 :(

任何帮助或建议将不胜感激:)

谢谢!

【问题讨论】:

  • VALUE 总是随着新行的添加而增加还是也可以减少
  • 嗨,VALUE 总是在增加 :)
  • 感谢@Zawd 提供的信息

标签: calculated-columns difference spotfire


【解决方案1】:
  1. 插入一列RowId() 并将其命名为RowNum
  2. 使用此表达式插入一列:

([value] - first([value]) over (intersect(previous([type]),AllNext([RowNum])))) * -1

这就是它的样子。我将该列命名为t1。您也可以忽略Val 列:

说明:

这里的技巧是将OVER 子句中的值限制在当前行之后的值。此外,我们希望获得符合我们标准的第一个、下一个可用值。所以,我们取第一个值first([value]),它是以前的[type]。这总是0,因为[type] 没有任何负值,因此这将我们正在使用的行限制为@ 987654333@ 使用previous([type])。现在,为了将其限制在当前行之后的行,我们使用AllNext([RowNum])Intersect 语句状态采用同时满足这两个规则的值。所以看着RowNum = 4,它的评估是这样的。

[value] = 25
Previous([type])= 0 since current type is 1
AllNext([RowNum]) = RowNum that is > our RowNum which is 4, so tow numbers 5 - 7
The First([Value]) that meets these criteria is in RowNum = 6, which is 29 since it has [Type] = 0 and it's RowNum is > 4
Note, Row 7 also meets this criteria but it isn't the First() one.
Now, do the math... 25-29 = -4, and since you said the values always increase, we just multiply by -1 to get it in the format you wanted

【讨论】:

  • 我很高兴能帮助@ZAWD OVER 函数是 Spotfires 中我最难学习的表达式之一,所以我尝试描述性!
  • 我对它真的很陌生,我想我可以更快地学习它,但是很难在短时间内理解它的语法
  • 嗨,我刚刚发布了一个关于它的新问题,我认为这会非常相似,如果您有兴趣,请参考stackoverflow.com/questions/39725348/… :)
  • 我已经找到了它的主要解决方案,但是有一个小错误:(
  • 很好 @ZAWD 我很高兴你找到它!
【解决方案2】:

@ZAWD - 解决此问题的另一种方法:

第 1 步:使用表达式 RowId() 插入计算列“RowID”

第 2 步:使用以下表达式插入计算列“test0”

sum([Value]) over (Intersect(next([RowID]),Previous([Type])))

第 3 步:使用以下表达式插入计算列“test”

[Value] - sum([test0]) over (Next([RowID]))

第 4 步:使用以下表达式插入计算列“myresult”

Abs(If((Sum([Type]) over ([RowID])=1) and (Sum([Type]) over (Next([RowID]))=1),[test],[Value] - [test0]))

注意:“test0”和“test”列在后台运行。它们不需要包含在主表中

决赛桌如下:

此外,无论值的顺序如何,此解决方案都可以正常工作。我已经在不同的场景下测试了此解决方案,并且似乎工作正常。

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2019-09-25
    • 2013-02-06
    相关资源
    最近更新 更多