![](/img/trans.png)
[英]How to use dates and logical operators in Spotfire Custom Expressions
[英]matching for group (Expressions) in same column in Spotfire
关于我发布的上一个问题: 计算Spotfire中特定行的相同列的差异
我有一个新问题,下面是样本:
我想要实现的新功能是,
数据规则:
输出应该是这样的:
我试过的解决方案:
If(([type]=1) and (first([type]) OVER (intersect(previous([type]),AllNext([status])))=0),"T",Null)
它看起来很好,但问题出在每个状态组中,例如第一个status = 1组中的最后一个TYPE = 1(第5行),它没有接下来最接近的TYPE = 0,因此判断为Null。 但基于代码,它是T! :(
有什么建议和想法吗? 非常感谢'! PS:一些细节:
好的,这个确实测试了我的极限,我很好奇它是否会扩展。 它适用于您的数据,给定NULL
。 花了几个小时才搞清楚。
RowId()
并将其命名为RowNum
RankReal([status],"ties.method=first")
并将其命名为Rank
If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))
并将其命名为GroupOfTypes
If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")
并将其命名为Marking
。 这是你真正关心的那一行。 结果
说明
RankReal([status],"ties.method=first")
这样做基本上是基于一段状态创建伪rownumber。 你会看到它按顺序排名。 这是我的方法分组数据的第一步。
If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))
第一部分, (first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0
正在评估前一行的[status]
列是否为与当前行相同。 如果是,则返回布尔值TRUE
。 如果它与前一行相同,我们知道它属于相同的块/分组,因此我们做一些数学运算来为整个块标记该列的相同值。 那是[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum])))
。 因此,我们分组中的每一行都将等同于相同的值。
If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")
最后,我们根据rownumber评估[type]
是否大于所有下一行的mnimal [type]
。 这限制了我们关注于那些数据[type] = 1
,而无需实际滤波的行中,而仅在数据集中期待 。 如果这是真的,我们用T标记它。
@ZAWD - 解决这个问题的另一种方法。
第1步:使用表达式RowId()创建RowID
第2步:使用下面的表达式创建计算列'Mark0'。 此步骤是查找当前类型不为0且其连续类型为0。
注意:此列在后台运行。 不需要包括在表中。 此外,100是一些虚拟值,仅用于确保满足条件
If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID]))=0),100)
第3步:使用下面的表达式创建计算列'Mark1'。 此步骤是查找当前类型不为0且其连续类型也不为0且Mark0已填充。
注意:此列在后台运行。 不需要包括在表中
If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID])) Is Not Null) and (first([Mark0]) over (allNext([RowID]))=100),100)
第4步:最后,使用下面的表达式创建“最终标记”列,其中Mark0和Mark1列中的标记为“T”
If(([Mark0]=100) or ([Mark1]=100),"T",null)
决赛桌:
我已经用你的数据以及不同的场景测试了这个,例如'type'列中的三个连续1,而不是两个,似乎工作正常。 请测试它,让我知道这是否稳定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.