SpotFire: добавление вычисляемого столбца со ссылкой на две (или более) последовательные строки - PullRequest
0 голосов
/ 07 июня 2019

У меня огромное количество данных с большим количеством столбцов.

  • 1-й столбец - Установка.
  • 2-ой столбец - Подустановка
  • 3-й столбец - дата начала / время неисправности
  • 4-й столбец - конечная дата / время неисправности
  • 5-й столбец - продолжительность неисправности

Это то, что мне нужно:

Иногда несколько записей должны отображаться как одна запись (хотя бы продолжительность). Так что это означает, если:

  • установка 2 следующих записей одинакова И из тех же записей
  • субустановка из 2 следующих записей такая же
  • дата / время начала 2-й записи находятся в пределах даты / времени окончания + 5 минут от 1-й записи

эти длительности записи должны быть суммированы.

Может быть, что 2 записи должны быть 1 записью, но также может быть так, что 8 записей подряд должны быть 1 записью.

Ins   Sub-In   Begin         End            Dur   Tot Dur  
x     1        1-1-15 00:00  1-1-15 00:03   3       11  
x     1        1-1-15 00:04  1-1-15 00:12   8       11  
x     1        1-1-15 00:18  1-1-15 00:22   4       4  
z     2        1-1-15 01:00  1-1-15 01:06   6       35  
z     2        1-1-15 01:07  1-1-15 01:16   9       35  
z     2        1-1-15 01:18  1-1-15 01:38   20      35   
z     2        1-1-15 01:45  1-1-15 01:49   4       9  
z     2        1-1-15 01:49  1-1-15 01:54   5       9  

В приведенном выше примере столбец Tot Dur - это тот, который я хочу реализовать.

Как вы можете видеть, первые 1 записи имеют одинаковые Inst (x) и Sub-Inst (1), а начальная дата / время 2-го числа находятся в пределах конечных данных / времени + 5 минут от 1-й записи. Поэтому обе длительности добавляются и отображаются для обеих записей в столбце Tot Dur: 11 (3 + 8).

Все записи 4-> 9 имеют одинаковые Inst (z) и Sub-Inst (2), но между записями 6 и 7 начальная и конечная дата / время различаются более чем на 5 минут (01:45 - 01:38 = 7 мин).

Поскольку начальная и конечная дата / время записей 4-> 6 находятся в пределах 5 минут, все они представляют собой 1 запись, и их продолжительность добавляется: 35 (6 + 9 + 20).

Пытался использовать функцию OVER с Intersect, но она не работала. Я думаю, что решения лежат в этих функциях, но не могу получить правильную формулу.

Если решение может быть достигнуто путем добавления более 1 вычисляемого столбца, это также прекрасно.

ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ

Я сузил это до следующего.

Ins   Sub-In   Begin         End            Dur   Same  Tot Dur  
x     1        1-1-15 00:00  1-1-15 00:03   3    8142    11  
x     1        1-1-15 00:04  1-1-15 00:12   8    Yes     11  
x     1        1-1-15 00:18  1-1-15 00:22   4    No      4  
z     2        1-1-15 01:00  1-1-15 01:06   6    9843    35  
z     2        1-1-15 01:07  1-1-15 01:16   9    Yes     35  
z     2        1-1-15 01:18  1-1-15 01:38   20   Yes     35   
z     2        1-1-15 01:45  1-1-15 01:49   4    6542    9  
z     2        1-1-15 01:49  1-1-15 01:54   5    Yes     9  

Единственное, что теперь должно произойти, - это новая вычисляемая строка, в которой RowId (8142, 9843, 6542) предыдущей строки помещается, если в столбце Same указано yes.

Тогда вычисление Тот Дур легко.

Есть мысли?

1 Ответ

0 голосов
/ 12 июня 2019

Я не уверен, как обрабатывать столбец «То же» в обновлении.Я согласен, что идея заключается в том, чтобы мы нашли способ сгруппировать строки, которые должны быть агломерированы.Я попытался найти решение, но оно стоило мне несколько вычисленных столбцов.Может быть, это поможет, и / или вы можете объединить это с пониманием вашего обновления.

Во-первых, создайте идентификатор строки: он нужен нам для перечисления строк

[ID]: RowId()

Затем создайте группу, объединяющую модули Ins и Sub-In: нам нужно определить, куда мы хотим переписать-старт, накапливающий разницу в датах

[group]:  Concatenate([Ins],[Sub-In])

Затем создайте столбец, в котором указан конец предыдущей строки, или, если предыдущей строки нет, добавьте 10 минут к концу текущей строки (так что мы можемпроигнорируем это позже):

[EndPrevious]:   SN(Min([End]) over (Previous([End])),DateAdd(“mi”,10,[End]))

На этом этапе мы можем создать текущий идентификатор групп строк, которые можно суммировать вместе, так как они имеют начало и конец в течение 5 минут:

[startGroup]: Sum(If(DateDiff('mi',[EndPrevious],[Begin])<=5,0,1)) over 
(intersect(Allprevious([ID]),[group])) + DenseRank([group])

Здесь когда If (DateDiff ('mi', [EndPrevious], [Begin]) <= 5,0,1) равно 0, если мы все еще в пределах той же стартовой группы, и 1, если мы начинаемновый.Это может быть установлено как отдельный столбец для ясности, но я хотел сэкономить на количестве столбцов. </p>

Наконец, вычислите сумму длительностей в [startGroup]:

[TotDur2]:  Sum([Dur]) over ([startGroup])
...