#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 Спасибо за объяснение. Теперь я понял.