2016-09-27 105 views
10

关于前一个问题,我已经张贴: calculation the difference for same column for the specific rows in Spotfire匹配为组(表达式)在同一列中在Spotfire

我有这方面的新的问题,下面是样品:

enter image description here

新的功能,我想知道的是,

  • 搜索的最近用于TYPE = 1
  • TYPE = 0,如果TYPE = 1具有最近的TYPE = 0,则其标记为在一个新的计算的列的 'T',否则为NULL

数据规则:

  • 状态列包含{1,2},以便,零空间的默认值是相同的,因为它上面的最近的最后状态值。
  • 类型列中只包含0和1的随机

输出应该是这样的:

enter image description here

的解决方案是我曾尝试:

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

它看起来很好,但问题出在每个状态组中,例如最后的TYPE = 1(t他第五行)在第一状态= 1组中,它没有下一个最接近的TYPE = 0,所以判断将是空值。但基于代码,它是T! :(

它的任何建议和想法 非常感谢' PS:?!一些细节:

  • 地位的第一类值为NULL在状态栏
  • 其他零空间可被填充,如下,如果它是为表达:)有所帮助:

enter image description here

+0

这是一个棘手。状态和类型为空的空值? – scsimon

+0

是的,但实际上,我们可以用最新状态填写空白值。 :) – ZAWD

+0

@scsimon,我添加了一些问题的细节,欢迎任何进一步的问题:) – ZAWD

回答

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。这是你真正关心的行。

结果

enter image description here

说明

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

最后,我们评估如果[type]比mnimal [type]在所有接下来的行的基础上,ROWNUMBER较大。这将我们关注的数据限制在那些没有实际过滤行的数据,而只在数据集中查看转发。如果这是真的,我们用T标记它。

+0

真的很抱歉的延迟!有一些问题,最近没有任何互联网 – ZAWD

+0

无忧@ZAWD它发生。它已成为一个受欢迎的问题,你可以看到:) – scsimon

+0

我很惊讶它,以及:) – ZAWD

1

@ZAWD - 解决这个问题的另一种方法。

步骤1:创建计算列 'Mark0' 使用下面的表达式:使用表达式RowId的()

步骤2中创建的RowId。此步骤是要查找当前类型不是0并且其连续类型为0.

注意:此列在后台运行。不需要包含在表格中。另外,100是仅用于确保满足条件一些虚值

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

步骤3:创建计算列“标记1”使用下面的表达式。这一步是要找到当前类型不是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:最后,使用低于该作为“T”

If(([Mark0]=100) or ([Mark1]=100),"T",null) 
在Mark0和标记1列标记100中的表达式创建“最后标记”列

决赛桌:

nearest 我与您的数据来测试这个问题,以及不同的情景就像'类型'列中的三个连续1而不是两个,似乎工作正常。请测试它,让我知道这是否稳定。

+0

嗨大谢谢你的答案,我已经测试的解决方案,它的作品很棒! – ZAWD

+0

不客气! – ksp585