Сопоставление для группы (выражения) в том же столбце в 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 в столбце "тип" вместо двух и, кажется, работает нормально. Пожалуйста, проверьте его и сообщите мне, если это стабильно.