Сопоставление для группы (выражения) в том же столбце в Spotfire

Относительно предыдущего вопроса, который я опубликовал: вычислить разницу для одного столбца для определенных строк в Spotfire

У меня есть новая проблема для него, ниже пример:

введите описание изображения здесь

Новая функция, которую я хочу реализовать,

  • поиск next ближайшего TYPE = 0 для TYPE = 1
  • если TYPE = 1 имеет ближайший TYPE = 0, затем отметьте его как 'T' в новом вычисляемом столбце, иначе как NULL

Правила данных:

  • Столбец
  • Статус содержит {1,2} в порядке, значение по умолчанию нулевого пространства совпадает с последним ближайшим статусом состояния над ним.
  • Строка содержит только 0 и 1 случайным образом

вывод должен выглядеть следующим образом:

введите описание изображения здесь

решение, которое я пробовал:

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

он выглядит хорошо, но проблема заключается в каждой группе состояний, например, в последнем первом типе = 1 (5-я строка) в первой группе состояния = 1, у нее нет ближайшего TYPE = 0, поэтому решение будет Ноль. Но на основе кода это T!:(

любое предложение и идея для него? большое спасибо'! PS: некоторые подробности:

  • первое значение типа состояния NULL
  • Другое пустое пространство в столбце состояния может быть заполнено, как показано ниже, если оно полезно для выражения:):

введите описание изображения здесь

Ответ 1

Хорошо, этот действительно проверял мои ограничения, и мне любопытно, будет ли он масштабироваться. Он работает для ваших данных, если у вас есть NULL. Понадобилось несколько часов.

  • Вставьте вычисленный столбец RowId() и назовите его RowNum
  • Вставьте вычисленный столбец RankReal([status],"ties.method=first") и назовите его Rank
  • Вставьте вычисленный столбец If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum])))) и назовите его GroupOfTypes
  • Инерт вычисленный столбец 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] с текущей строкой. Если это так, он возвращает значение boolean 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.

Ответ 2

@ZAWD - Другой способ решения этого вопроса.

Шаг 1: Создал RowID, используя выражение RowId()

Шаг 2: Создал вычисленный столбец "Mark0", используя приведенное ниже выражение. Этот шаг состоит в том, чтобы найти текущий тип не 0, а его последовательный тип равен 0.

Примечание. Этот столбец работает в фоновом режиме. Не нужно включать в таблицу. Кроме того, 100 - некоторое фиктивное значение, которое используется только для обеспечения выполнения условия

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

Шаг 3: Создал расчетный столбец "Mark1", используя приведенное ниже выражение. Этот шаг состоит в том, чтобы найти текущий тип не 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: Наконец, создаем столбец "final mark", используя выражение, ниже которого отметки 100 в столбцах Mark0 и Mark1 как "T"

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

Конечная таблица:

ближайшее Я тестировал это с вашими данными, а также разными сценариями, например, тремя последовательными 1 в столбце "тип" вместо двух и, кажется, работает нормально. Пожалуйста, проверьте его и сообщите мне, если это стабильно.