Расчетный столбец на основе значений другого столбца в 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 в новый столбец для этой строки. Я также хочу, чтобы то же самое значение bin pass = 1 было скопировано в соответствующее местоположение, пластину, координату 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

Он копирует корзину в любые строки с проходом = 1, но не с проходом = 2 строками.


person Brittany Enfield    schedule 06.10.2015    source источник


Ответы (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() вернет NA для каждой строки, в которой [pass] != 1, и вы можете увидеть это, изменив 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(), поскольку мы сравниваем только по одному столбцу)

документацию по функциям OVER с примерами см. в файле справки Spotfire по адресу Advanced Custom Expressions. Я знаю, что это все еще не совсем понятно; Функции OVER - это небольшая растяжка для мозга :)


просто чтобы добавить контекст к вашей первой попытке и почему это не сработало:

поскольку вы не производите никаких вычислений для значения [bin], вы можете упростить его, используя следующий случай:

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

конечно, выражение, которое у вас есть, не возвращает никакого значения, когда [pass] != "1", поскольку вы не указали никаких других случаев. чтобы исправить это, вам понадобится что-то вроде этого:

CASE
  WHEN [pass] = "1" THEN [bin]
  WHEN [pass] != "NA" THEN ...
  ELSE null
END
person niko    schedule 06.10.2015
comment
Спасибо за все указатели. Это было очень полезно! Итак, когда я запускаю это, он добавляет значение корзины в строки без значения передачи в них. Как я могу заставить его игнорировать строки, у которых нет значения передачи? Так, например, это выглядит так: 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 13 - person Brittany Enfield; 06.10.2015
comment
Я не понимал, что это будет выглядеть странно. По сути, значение newCol для 4-й строки (не включая заголовок) выходит на 13 вместо NA. - person Brittany Enfield; 06.10.2015
comment
Попался! Я обновил ответ, чтобы отразить это требование :) - person niko; 06.10.2015
comment
Фантастика. Вы мне очень помогли! Спасибо еще раз! - person Brittany Enfield; 06.10.2015
comment
@BrittanyEnfield отлично, рад, что смог помочь :) не могли бы вы пометить вопрос как решенный? - person niko; 07.10.2015