2017-01-12 4 views
0

У меня есть таблица с различными объектами , и объекты эволюционируют со временем. Один объект идентифицируется object_number, и мы можем отслеживать его с помощью object_line_number. И каждая эволюция объекта имеет статус.PowerBI Получить предыдущее значение строки в соответствии с фильтрами

Я хочу рассчитать время, прошедшее между определенным статусом.

Ниже моя таблица один object_number "US1":

enter image description here

В желтого являются rowscontaining начальной даты. Они обнаруживаются, если (status_id = 0 и (old_status <> 0 или object_line_number = 1) и emergency_level = 1).

В зеленый - это строки, содержащие дату окончания. Они обнаруживаются, если (status_id = 2,3,4,5 и old_status = 0).

Столбец old_status не существует в таблице. Это статус предыдущей строки (в соответствии с объектом) line_number). Я извлечение его благодаря следующему измерению:

old_status = CALCULATE (
MAX(fact_object[status_id]), 
FILTER (
     ALL(fact_object), 
     fact_object[object_line_number] = IF(fact_object[object_line_number]=1, fact_object[object_line_number], MAX (fact_object[object_line_number])-1)), 
VALUES (fact_object[object_number])) 

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

Как только это будет сделано, я хочу, чтобы потом иметь возможность получить для каждого зеленый подряда date_modification предыдущего желтого подряда.

В этом примере результат будет 4/4, то 1. Так что я могу рассчитать разницу во времени между date_modification текущего зеленой строки и date_modification предыдущего ряда желтого.

Так что я думал о добавлении нового столбца с именем date_received, который является date_modification предыдущей желтой строки; enter image description here

Оттуда, я просто должен держать только зеленые строки и вычислить разницу между date_modification и date_received.

Мой окончательный Расчитать на самом деле иметь это:

Результат = (число зеленых строк, дату разница между date_modification и date_received < = 15 мин)/(количество зеленых строк какой день (date_modification) = DAY (date_received))

Но я не знаю, как это сделать. Я попытался в том же духе меры OLD_STATUS, чтобы сделать это:

date_received = CALCULATE (
MAX(fact_object[date_modification]), 
FILTER (
    ALL(fact_object), 
    (fact_object[object_line_number] = MAX (fact_object[object_line_number])-1) && MY OTHER FILTERS 
), 
VALUES (fact_object[object_number]) 

) 

Но не удалось.

В SQL эквивалент будет выглядеть так:

SELECT 
    SUM(CASE WHEN (DATEDIFF(MINUTE, T.date_received, T.date_planification) <= 15) THEN 1 ELSE 0 END)/
    SUM(CASE WHEN (DAY(T.date_received) = DAY(T.date_planification)) THEN 1 ELSE 0 END) as result 
FROM (
    SELECT *, T.status_id as current_status, 
     LAG(T.date_modification) OVER(PARTITION BY T.object_number ORDER BY T.object_line_number) as date_received, 
     T.date_modification as date_planification 
    FROM 
    (
     select *, 
      LAG (status_id) OVER(PARTITION BY object_number ORDER BY object_line_number) AS old_status 
     from dbo.fact_object 
    ) AS T 
    WHERE ((T.status_id = 0 AND (T.old_status <> 0 OR T.object_line_number = 1) AND T.emergency_level = 1) OR (T.old_status = 0 AND T.status_id IN (2,3,4,5)))--974 
) AS T 
WHERE old_status = 0 

(ну, может быть, есть лучший способ сделать это в SQL, что я сделал).

Как я могу это достичь?

ответ

0

В этом случае, я бы первым отсортировать таблицу по объекту, то по номеру строки объекта (или Дата изменения - но они появляются не менять для каждой строки.)

Дублировать таблицу

Table1 - Добавить индекс, начиная с 1 table2 - Добавить индекс, начиная с 0

от Table1, объединить его с table2, используя новые индексные поля

Разверните MergedStatus ID (переименовать NextStatusID) и Ob ject (переименовать в NextObject).

Теперь вы можете создать новый условный столбец для сравнения двух полей состояния. Например. Статус 2 = Если Object = NextObject, тогда [NextStatusID] еще null

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