Проблема расписания в PowerBI - (для гистограммы с накоплением) - PullRequest
0 голосов
/ 05 декабря 2018

Заранее спасибо за ваше время!

Я использую DirectQuery для SQL.Данные не могут быть импортированы, потому что ddbb слишком велик.В этой основной таблице / таблице фактов у меня есть столбец «дата» -dd / MM / гггг и столбец «время» -HH: MM: SS.Я рассчитал таблицу календаря для дат и попытался рассчитать расписание, используя различные решения, которые я нашел в Интернете с помощью M или DAX.Но ни один график не работает должным образом.Например: при фильтрации по «часу 8» необходимо будет постоянно выделять время между 8:00:00 и 8:59:59, но не отображаются все записи данных в этом временном диапазоне.

Мне нужно составить столбчатую столбчатую диаграмму / столбчатую диаграмму с накоплением: Ось X: ЧАС Ось Y: количество операций, сгруппированных по языкам.Но почему-то не все операции показаны на графике.Я считаю, что рассчитанная таблица времени не фильтрует должным образом столбец времени из моей таблицы фактов.

Экран печати PowerBI

Примечание. У меня установлена ​​последняя версия PowerBI-ноябрь.

* Примечание. Для таблицы времени, в которой я использовал этиспособы:

  1. в М:
let

Source = List.Times(#time(0,0,0) , 1440, #duration(0,0,1,0)),
convertToTable = Table.FromList(Source, Splitter.SplitByNothing(), {"DayTime"}, null, ExtraValues.Error),
createTimeKey = Table.AddColumn(convertToTable, "TimeKey", each Time.ToText([DayTime], "HHmmss")),
hourIndex = Table.AddColumn(createTimeKey, "HourIndex", each Time.Hour([DayTime])),
minuteIndex = Table.AddColumn(hourIndex, "MinuteIndex", each Time.Minute([DayTime])),
setDataType = Table.TransformColumnTypes(minuteIndex,{{"DayTime", type time}, {"TimeKey", type text}, {"HourIndex", Int64.Type},
{"MinuteIndex", Int64.Type}})

in
setDataType
более сложный М-код, который я нашел.Мне не нужны детали такого рода, но я не изменил их, потому что увидел, что они не работают.
let CreateTimeTable = () as table =>
let
 // Similar to our CreateDateTable script, we start with the smallest unit of the dimension, minute
 // There are a fixed number of minutes in a day, so no need for parameters here
 // 525,600 minutes divided by 365 days in a year = 1440 minutes in a day. 
 // Who says we never learn from Broadway musicals?
 MinuteCount = 1440,
 // Now create a Time type list for a total of 1440 minutes, incrementing one minute at a time
 Source = List.Times(#time(0, 0, 0),MinuteCount, #duration(0,0,1,0)),
 // Turn that list into a one column table
 TableFromList = Table.FromList(Source, Splitter.SplitByNothing()), 
 // Change that table's one column to type Time
 ChangedType = Table.TransformColumnTypes(TableFromList,{{"Column1", type time}}),
 // Rename column to Time
 RenamedColumns = Table.RenameColumns(ChangedType,{{"Column1", "Time"}}),
 // Start inserting columns for each unit of time to represent in the dimension
 InsertHour = Table.AddColumn(RenamedColumns, "Hour", each Time.StartOfHour([Time])),
 InsertMinute = Table.AddColumn(InsertHour, "Minute", each Time.Minute([Time])),
 ChangedTypeHour = Table.TransformColumnTypes(InsertMinute,{{"Hour", type time}}),
 // Creating levels in the hierarchy that might be useful for reporting. Omit if not useful to yours
 InsertQuarterHour = Table.AddColumn(ChangedTypeHour, "Quarter Hour", each if [Minute]<15 then [Hour] else if [Minute] < 30 then Value.Add([Hour],#duration(0,0,15, 0)) else if [Minute] < 45 then Value.Add([Hour],#duration(0,0,30, 0)) else Value.Add([Hour],#duration(0,0,45, 0))),
 ChangedTypeQtrHr = Table.TransformColumnTypes(InsertQuarterHour,{{"Quarter Hour", type time}}),
 ReorderedColumns = Table.ReorderColumns(ChangedTypeQtrHr,{"Time", "Hour", "Quarter Hour", "Minute"}),
 InsertHourNumber = Table.AddColumn(ReorderedColumns, "Hour Number", each Time.Hour([Time])),
 NextHour = Table.AddColumn(InsertHourNumber, "Next Hour", each Value.Add([Hour],#duration(0,1,0, 0))),
 NextQuarterHour = Table.AddColumn(NextHour, "Next Quarter Hour", each Value.Add([Quarter Hour],#duration(0,0,15, 0))),
 InsertPeriod = Table.AddColumn(NextQuarterHour, "Period of Day", 
 each if [Hour Number] >= 0 and [Hour Number] < 4 then "After Midnight" else 
 if [Hour Number] >= 4 and [Hour Number] < 8 then "Early Morning" else
 if [Hour Number] >= 8 and [Hour Number] < 12 then "Late Morning" else
 if [Hour Number] >= 12 and [Hour Number] < 16 then "Afternoon" else
 if [Hour Number] >= 16 and [Hour Number] < 20 then "Evening" else "Late Night"),
 InsertPeriodSort = Table.AddColumn(InsertPeriod, "PeriodSort", each 
 if [Hour Number] >= 0 and [Hour Number] < 4 then 0 else 
 if [Hour Number] >= 4 and [Hour Number] < 8 then 1 else
 if [Hour Number] >= 8 and [Hour Number] < 12 then 2 else
 if [Hour Number] >= 12 and [Hour Number] < 16 then 3 else
 if [Hour Number] >= 16 and [Hour Number] < 20 then 4 else 5),
 InsertTimeKey = Table.AddColumn(InsertPeriodSort, "TimeKey", each Time.ToText([Time], "HHmm"), type text)
 in
 InsertTimeKey
in
 CreateTimeTable
Наконец, простая колонка DAX, которую я создал в DAX, так проста:
Hora = VALUES(FactTable[I_Time])
hour = FORMAT(Hora[I_Time]; "HH")
hora2 = time(Hora[hour];0;0) 

Это то, чего я хочу достичь! Цель !но по какой-то причине данные не отображаются должным образом.Я проверяю это с помощью SQL-запросов.И я полагаю, это потому, что расписание связано как многие с обеих сторон с таблицей фактов.В расписании нет уникальных значений, но я думаю, что оно должно быть таким же, как и у календаря.Сейчас я использую расписание с кодом DAX (3).

Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете просто добавить вычисляемый столбец «Час» в таблицу фактов, используя DAX:

Hour = HOUR ( FactTable[I_Time] )

Или вы можете сгенерировать таблицу TIME, используя этот М-код (упрощенная версия # 2, вваш вопрос), и создайте связь со столбцом Time вашей таблицы фактов:

let
    Source = List.Times(#time(0, 0, 0), 1440, #duration(0,0,1,0)),
    #"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), {"Time"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Converted to Table",{{"Time", type time}}),
    #"Inserted Hour" = Table.AddColumn(#"Changed Type", "Hour", each Time.Hour([Time]), Int64.Type)
in
    #"Inserted Hour"
...