Рекомендация инструмента для преобразования данных

#powerbi #dax #azure-data-factory

#powerbi #dax #azure-data-factory

Вопрос:

У меня есть большие объемы необработанных данных о неисправностях в Power BI.

 code    time                    status  
x123    2019-04-22T23:57:00     ok  
x123    2019-04-23T01:00:00     faulty  
x123    2019-04-23T02:00:00     ok  
x123    2019-04-23T23:00:00     faulty  
x123    2019-04-24T01:00:00     ok  
  

Мне нужно преобразовать это, чтобы показать, как долго элемент находился в неисправном состоянии в определенный день. Итак, 23-го числа элемент находился в неисправном состоянии между 1 и 2 часами утра, а затем снова с 11 вечера до полуночи.

 code    day         % of day faulty  
x123    23/04/2019  8.30%           (2 hours)  
  

Могу ли я легко сделать это в Power BI или мне следует использовать другой инструмент, такой как Azure Data Factory?

Ответ №1:

Добавьте в свою таблицу следующие вычисляемые столбцы:

Report Date = Table1[time].[Date]

 Fault Duration = 
VAR CurrentTime = Table1[time]
VAR CurrentCode = Table1[code]
VAR PreviousTime = 
    CALCULATE ( 
        MAX ( Table1[time] ),
        FILTER ( 
            Table1,
            Table1[time] < CurrentTime amp;amp; 
            Table1[code] = CurrentCode
        )
    )
VAR NextTime = 
    CALCULATE ( 
        MIN ( Table1[time] ),
        FILTER ( 
            Table1,
            Table1[time] > CurrentTime amp;amp; 
            Table1[code] = CurrentCode
        )
    )
VAR FaultyFrom = 
    IF(
        Table1[status] = "faulty",
        Table1[time],
        IF (
            DAY(PreviousTime) = DAY(Table1[time]),
            BLANK(),
            Table1[time].[Date]
        )
    )
VAR FaultyTo = 
    IF ( 
        Table1[status] = "ok",
        Table1[time],
        IF (
            DAY(NextTime) = DAY(Table1[time]),
            NextTime,
            Table1[time].[Date]   1
        )
    )
RETURN
    IF(
        ISBLANK ( PreviousTime ) || ISBLANK ( NextTime ) || ISBLANK ( FaultyFrom ),
        BLANK(),
        FaultyTo - FaultyFrom
    )
  

Теперь создайте меры:

Faulty Hours = SUM ( Table1[Fault Duration] )

 Faulty % Day = 
    IF ( 
        HASONEVALUE ( Table1[Report Date] ),
        DIVIDE ( 
            [Faulty Hours],
            DISTINCTCOUNT ( Table1[code] ),
            BLANK()
        ),
        BLANK()
    )
  

Вывод:

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

См https://pwrbi.com/so_55825688 / для примера файла PBIX

Комментарии:

1. Блестяще! Большое спасибо

2. @Olly Я пытаюсь создать вычисляемый столбец «Предыдущее время» из вашего ответа. Это работает, когда я помещаю «currentTime» и «CurrentCode» в правую часть сравнения. Однако это не работает, когда я помещаю Table1 [время] и Table1 [код] с правой стороны. Это приводит ко всем пустым значениям. Не могли бы вы, пожалуйста, объяснить это поведение?

3. Контекст. У нас есть контекст на уровне строк, когда мы оцениваем переменные. CALCULATE вызывает переход контекста (что нам и нужно, поскольку мы хотим просмотреть все строки таблицы), поэтому контекст на уровне строк больше не существует. Мы могли бы использовать EARLIER ( Table1[time] ) вместо переменной, но есть (незначительный) прирост производительности от оценки переменных только один раз.

4. @Olly Спасибо за объяснение. Теперь я понял.