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

ZAW*_*AWD 10 expression calculated-columns 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)
Run Code Online (Sandbox Code Playgroud)

它看起来很好,但问题出在每个状态组中,例如第一个status = 1组中的最后一个TYPE = 1(第5行),它没有接下来最接近的TYPE = 0,因此判断为Null.但基于代码,它是T!:(

有什么建议和想法吗?非常感谢'!PS:一些细节:

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

在此输入图像描述

scs*_*mon 1

好吧,这确实测试了我的极限,我很好奇它是否会扩展。它适用于您的数据,只要您拥有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. 惰性计算列If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")并为其命名Marking。这是您真正关心的行。

结果

在此输入图像描述

解释

RankReal([status],"ties.method=first")

这样做的目的本质上是根据一段状态创建一个伪行号。您将看到它根据状态按顺序排名。这是我对数据进行分组的方法的第一步。

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")

最后,我们根据行号评估 是否[type]大于所有接下来的行的 mnimal 。[type]这将我们关注的数据限制在那些[type] = 1没有实际过滤行的数据上,而只在数据集中进行展望。如果这是真的,我们用 T 标记它。