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

matching for group (Expressions) in same column in Spotfire

关于我之前发布的问题:

我有一个新问题,下面是示例:

我要实现的新功能是,

数据规则:

输出应该是这样的:

我尝试过的解决方案:

    If(([type]=1) and (first([type]) OVER (intersect(previous([type]),AllNext([status])))=0),"T",Null)

看起来不错,但是问题出在每个status组,比如第一个status=1组的最后一个TYPE=1(第5行),没有next nearest TYPE=0,所以判断将为空。但是根据代码,它是T! :(

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

好的,这个真的测试了我的极限,我很好奇它是否会扩展。它适用于您的数据,前提是您有 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] 列是否与当前行相同。如果是,它 returns 一个布尔 TRUE 值。如果它与前一行相同,我们就知道它属于同一个块/组,所以我们做一些数学运算,用整个块的相同值来标记这一列。即[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum])))。因此,我们分组中的每一行都将等于相同的值。

If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")

最后,我们根据行号评估 [type] 是否大于接下来所有行的最小值 [type]。这将我们关注的数据限制在 [type] = 1 而没有实际过滤行的数据,而只在数据集中查看 forward。如果这是真的,我们用 T.

标记它

@ZAWD - 另一种解决方法。

步骤 1: 使用表达式 RowId()

创建了一个 RowID

步骤 2: 使用以下表达式创建了一个计算列 'Mark0'。这一步是为了查找当前类型不为0且其连续类型为0。

注意:该栏在后台运行。不必包含在table中。此外,100 是一些虚拟值,仅用于确保满足条件

If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID]))=0),100)

第 3 步: 使用以下表达式创建计算列 'Mark1'。这一步是查找当前类型不为0且其连续类型也不为0,并填充Mark0。

注意:此列在后台运行。不需要包含在table

If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID])) Is Not Null) and (first([Mark0]) over (allNext([RowID]))=100),100)

第 4 步: 最后,使用以下表达式创建 'final mark' 列,该表达式将 Mark0 和 Mark1 列中的 100 标记为 'T'

If(([Mark0]=100) or ([Mark1]=100),"T",null)

最终 Table:

我已经用您的数据以及不同的场景(例如 'type' 列中的三个连续 1 而不是两个)对此进行了测试,并且似乎工作正常。请测试一下,让我知道这是不是 stable.