ZAW*_*AWD 10 expression calculated-columns spotfire
关于我发布的上一个问题: 计算Spotfire中特定行的相同列的差异
我有一个新问题,下面是样本:
我想要实现的新功能是,
数据规则:
输出应该是这样的:
我试过的解决方案:
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:一些细节:
好吧,这确实测试了我的极限,我很好奇它是否会扩展。它适用于您的数据,只要您拥有NULL. 我花了几个小时才弄清楚。
RowId()并为其命名RowNumRankReal([status],"ties.method=first")并为其命名RankIf((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))并为其命名GroupOfTypesIf([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 标记它。