在Spotfire的另一列中计算基于关闭值的列

时间:2015-10-06 14:53:19

标签: spotfire

我刚刚开始使用Spotfire,并且在确定如何创建特定计算列时遇到了一些困难。我非常确定我需要使用OVER功能,但我还没有完全理解它,并且几乎没有关于互联网的文档或示例。

以下是我正在使用的数据示例:

loc     wafer   x   y   pass    bin  
T25     10      2   37  1       13  
T25     10      2   37  2       6  
CMI     10      2   37  NA      13  
T25     10      2   37  NA      13  
T25     10      2   38  1       13  
T25     10      2   38  2       13  
CMI     10      2   38  NA      13  
T25     10      2   38  NA      13  
T25     10      2   70  1       1  
T25     10      2   70  2       4  
CMI     10      2   70  NA      1  
CMI     10      2   70  NA      1  
T25     10      2   70  NA      1  
T25     10      2   70  NA      1  

我尝试创建的列将基于传递值。因此,对于每个位置,晶圆和x-y坐标,每当pass = 1时,我想将bin值复制到该行的新列中。我还希望将相同的pass = 1 bin值复制到匹配位置,晶圆,x-y坐标,其中pass不是NA。这就是我想看到的内容:

loc     wafer   x   y   pass    bin newCol  
T25     10      2   37  1       13  13  
T25     10      2   37  2       6   13  
CMI     10      2   37  NA      13  NA  
T25     10      2   37  NA      13  NA  
T25     10      2   38  1       13  13  
T25     10      2   38  2       13  13  
CMI     10      2   38  NA      13  NA  
T25     10      2   38  NA      13  NA  
T25     10      2   70  1       1   1  
T25     10      2   70  2       4   1  
CMI     10      2   70  NA      1   NA  
CMI     10      2   70  NA      1   NA  
T25     10      2   70  NA      1   NA  
T25     10      2   70  NA      1   NA  

我目前的表达方式如下:

CASE
  WHEN [pass] = "1" THEN Concatenate([bin]) OVER ([location],[wafer],[x],[y])
END

它将bin复制到pass = 1的任何行,但不复制pass = 2行。

1 个答案:

答案 0 :(得分:1)

编辑以避免在[bin]时获得[pass] = "NA"值,将If()中的所有内容包围起来,如下所示:

If([pass]!="NA", First(If([pass]="1",String([bin]),"NA")) OVER (Intersect([loc],[wafer],[x],[y])), "NA")

我认为你是在正确的轨道上,但这不是一个简单的表达!这就是我想出的:

First(If([pass]="1",String([bin]),"NA")) OVER (Intersect([loc],[wafer],[x],[y]))

所以让我们打破这个:

    之所以选择
  • First(...)是因为我们想要第一个结果!内联If()将为[pass] != 1的每一行返回 NA ,您可以通过将First()更改为Concatenate()
  • If([pass] = "1", String([bin]), "NA")确保我们记录[bin] NA 中的值。如果没有这个,我们的结果将包含[bin]的所有值 - 请尝试删除If()并查看!
  • OVER Intersect([loc], [wafer], [x], [y])为这四列的每个唯一组合创建“节点”层次结构(请参阅下面链接的文档)。

注意,由于Intersect(...),根据数据的大小,这可能是一个非常慢的表达式。如果您发现计算刷新数据的时间需要很长时间,那么您可能会有两列更好的结果:

  1. [ID],只是Concatenate([loc], [wafer], [x], [y])
  2. [Result]这是上面的答案,但结尾看起来像... OVER [ID](我们不需要使用Intersect(),因为我们只是在一列中进行比较)
  3. 有关带有示例的OVER函数的文档,请查看Advanced Custom Expressions处的Spotfire帮助文件。我知道它仍然不是完全可以理解的; OVER功能对于大脑来说有点延伸:)

    只是为您的第一次尝试添加一些上下文以及它无法正常工作的原因:

    由于您没有对[bin]的值进行任何计算,因此使用以下情况进行简化:

    WHEN [pass] = "1" THEN [bin]
    

    当然,你所拥有的表达式在[pass] != "1"时没有返回任何值,因为你没有指定任何其他情况。要解决这个问题,你需要这样的东西:

    CASE
      WHEN [pass] = "1" THEN [bin]
      WHEN [pass] != "NA" THEN ...
      ELSE null
    END