2016-09-27 4 views
10

Что касается предыдущего вопроса, который я разместил: calculation the difference for same column for the specific rows in Spotfireсоответствия для группы (Выражения) в той же колонке в Spotfire

У меня новая проблема для него, ниже образец:

enter image description here

новая функция, я хочу, чтобы реализовать это,

  • ищет следующего ближайшего ТИП = 0 для TYPE = 1
  • если TYPE = 1 имеет ближайший TYPE = 0, то пометить его как 'Т' в новом вычисляемого столбца, в противном случае, как 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 он 5-й ряд) в первом состоянии = 1 группа, он не имеет ближайшего TYPE = 0, поэтому решение будет Null. Но на основе кода это T! :(

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

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

enter image description here

+0

этот один сложный. Являются ли пустые значения в статусе и типом null? – scsimon

+0

Да, но на самом деле мы можем заполнить пустые значения своим последним статусом. :) – ZAWD

+0

@scsimon, я добавил некоторые детали для вопроса, любой дальнейший вопрос приветствуется :) – ZAWD

ответ

1

Хорошо, это о ne действительно проверял мои ограничения, и мне любопытно, будет ли он масштабироваться. Он работает для ваших данных, если у вас есть 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] предыдущей строки является таким же, как в текущей строке. Если это так, он возвращает значение boolean TRUE. Если это то же самое, что и предыдущая строка, мы знаем, что она принадлежит к одному блоку/группировке, поэтому мы делаем некоторую математику для обозначения этого столбца с тем же значением для всего блока. То есть [Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))). Поэтому каждая строка внутри нашей группировки будет равна одному значению.

If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")

Наконец мы оцениваем если [type] больше, чем mnimal [type] по всем следующим строкам, на основе RowNumber. Это ограничивает данные, на которые мы фокусируемся, на те, где [type] = 1 фактически не фильтрует строки, а смотрит только вперед в наборе данных. Если это верно, мы отмечаем его с помощью T.

+0

очень жаль за задержку !!! есть некоторые проблемы, которые в последнее время без какого-либо Интернета – ZAWD

+0

Не беспокойтесь @ZAWD, это происходит. Это стало популярным вопросом, как вы можете видеть :) – scsimon

+0

Я был так удивлен этим :) – ZAWD

1

@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: Наконец, созданный столбец «Итоговая оценка» используя выражение, ниже которого исполняется 100 в Mark0 и mark1 столбцах как «Т»

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

Финальный стол:

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

+0

привет большое спасибо за ответ, я протестировал решение, он отлично работает !!!! – ZAWD

+0

Добро пожаловать! – ksp585

Смежные вопросы