繁体   English   中英

匹配Spotfire中同一列中的组(表达式)

[英]matching for group (Expressions) in same column in Spotfire

关于我发布的上一个问题: 计算Spotfire中特定行的相同列的差异

我有一个新问题,下面是样本:

在此输入图像描述

我想要实现的新功能是,

  • 为TYPE = 1搜索下一个最接近的TYPE = 0
  • 如果TYPE = 1具有最接近的TYPE = 0,则在新计算列中将其标记为“T”,否则为NULL

数据规则:

  • 状态列按顺序包含{1,2},空值空间的默认值与其上方最后一个最接近的状态值相同。
  • 类型列只包含0和1

输出应该是这样的:

在此输入图像描述

我试过的解决方案:

    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:一些细节:

  • 状态的第一个Type值为NULL
  • 状态列中的其他空格可以填充如下,如果它对表达式有用:):

在此输入图像描述

好的,这个确实测试了我的极限,我很好奇它是否会扩展。 它适用于您的数据,给定NULL 花了几个小时才搞清楚。

  1. 插入计算列RowId()并将其命名为RowNum
  2. 插入计算列RankReal([status],"ties.method=first")并将其命名为Rank
  3. 插入计算列If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))并将其命名为GroupOfTypes
  4. Inert计算列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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM