计算 Spotfire 中特定行的同一列的差异
calculation the difference for same column for the specific rows in Spotfire
我在 Spotfire 中使用计算列计算行的差异时遇到问题。
我想知道是否可以创建一个计算列来计算当前行与具有不同属性的下一行之间的差异。
示例 table 可能是这样的:
结果可能是这样的:
基本行是:
- 当type=1时,计算其当前value与其下一个type最近的行之间的差值=0,然后将结果添加到新的计算列中。
- 顺便说一句,VALUE 总是在增加 :)
- 例如第一个结果2,当前值为20,下一行是最接近0的类型,下一行的值为22,则结果是 2
- 但是对于下一个type=1,当前值为25,其最近的type=0在第六行,所以结果可能是29-25=4
我试过的方法:
- 我添加了一个新的 RowID 列
然后试试代码:
if([type]=1),[value] - Sum([value]) OVER (PreviousPeriod([RowID])),null)
但它只是显示了类型 1、无类型 1 和类型 0 之间的区别:(
任何帮助或建议将不胜感激:)
谢谢!
- 插入一列
RowId()
并将其命名为 RowNum
- 使用此表达式插入一列:
([value] - first([value]) over (intersect(previous([type]),AllNext([RowNum])))) * -1
这是它的样子。我将该列命名为 t1
。您也可以忽略 Val
列:
解释:
这里的技巧是将 OVER
子句中的值限制为当前行之后的值。此外,我们希望获得符合我们标准的第一个、下一个可用值。因此,我们采用第一个值 first([value])
,它是前一个 [type]
。这始终为 0,因为 [type]
没有任何负值,因此这限制了我们的行数使用 previous([type])
与 [type] = 1
的人一起工作。现在,要将其限制为仅显示当前行之后的行,我们使用 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 - 另一种解决方法:
步骤 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' 列 运行 在背景中。它们不需要包含在主要 table
中
最终 table 如下所示:
此外,无论值的顺序如何,此解决方案都可以正常工作。我已经在不同的场景中测试了此解决方案,似乎工作正常。
我在 Spotfire 中使用计算列计算行的差异时遇到问题。
我想知道是否可以创建一个计算列来计算当前行与具有不同属性的下一行之间的差异。 示例 table 可能是这样的:
结果可能是这样的:
基本行是:
- 当type=1时,计算其当前value与其下一个type最近的行之间的差值=0,然后将结果添加到新的计算列中。
- 顺便说一句,VALUE 总是在增加 :)
- 例如第一个结果2,当前值为20,下一行是最接近0的类型,下一行的值为22,则结果是 2
- 但是对于下一个type=1,当前值为25,其最近的type=0在第六行,所以结果可能是29-25=4
我试过的方法:
- 我添加了一个新的 RowID 列
然后试试代码:
if([type]=1),[value] - Sum([value]) OVER (PreviousPeriod([RowID])),null)
但它只是显示了类型 1、无类型 1 和类型 0 之间的区别:(
任何帮助或建议将不胜感激:)
谢谢!
- 插入一列
RowId()
并将其命名为RowNum
- 使用此表达式插入一列:
([value] - first([value]) over (intersect(previous([type]),AllNext([RowNum])))) * -1
这是它的样子。我将该列命名为 t1
。您也可以忽略 Val
列:
解释:
这里的技巧是将 OVER
子句中的值限制为当前行之后的值。此外,我们希望获得符合我们标准的第一个、下一个可用值。因此,我们采用第一个值 first([value])
,它是前一个 [type]
。这始终为 0,因为 [type]
没有任何负值,因此这限制了我们的行数使用 previous([type])
与 [type] = 1
的人一起工作。现在,要将其限制为仅显示当前行之后的行,我们使用 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 - 另一种解决方法:
步骤 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' 列 运行 在背景中。它们不需要包含在主要 table
中最终 table 如下所示:
此外,无论值的顺序如何,此解决方案都可以正常工作。我已经在不同的场景中测试了此解决方案,似乎工作正常。