PowerBI Получить значение предыдущей строки в соответствии с фильтрами

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

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

Ниже приведена моя таблица для одного object_number "us1":

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

желтым - строки, содержащие дату начала. Они обнаруживаются, если (status_id = 0 и (old_status ‹> 0 или object_line_number = 1) и Emergency_level = 1).

Зеленым цветом выделены строки, содержащие дату окончания. Их можно найти, если (status_id = 2,3,4,5 and 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 предыдущей желтой строки; введите здесь описание изображения

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

Мой последний расчет на самом деле состоит в следующем:

Результат = (количество зеленых строк с разницей в датах между date_modification и date_received ‹= 15 мин) / (количество зеленых строк, у которых DAY (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, который я сделал).

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


person Gaston G    schedule 12.01.2017    source источник


Ответы (1)


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

Дублируйте таблицу

Таблица1 - Добавить индекс, начиная с 1 Таблица2 - Добавить индекс, начиная с 0

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

Разверните MergedStatus ID (переименуйте в NextStatusID) и поле Object (переименуйте в NextObject).

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

person Katrina    schedule 17.01.2017