2016-12-22 7 views
1

Я работаю над отчетом в Power BI. Одна из таблиц в моей модели данных собирает данные датчиков. Он имеет следующие столбцы:Как включить «Время» в иерархии даты в Power BI

  • Последовательный (INT) т.е. 123456789
  • Отметка (DateTime) т.е. 12/20/2016 12:04:23 PM
  • Чтение (десятичное) т.е. 123.456

Новая запись добавляется каждые несколько минут с текущим отсчетом от датчика.

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

Я хотел бы включить часть данных «Время» в иерархию, чтобы вы могли развернуть еще один уровень после «Дня» и просмотреть подробные данные за этот период.

Я уже установил таблицу Date, используя функцию CALENDARAUTO(), добавив все соответствующие столбцы и связав ее с моей таблицей Readings, чтобы суммировать данные по дате, что отлично работает. Но он не включает измерение «Время».

Я посмотрел на следующие вопросы SO, но они не помогли:

Time-based drilldowns in Power BI powered by Azure Data Warehouse

Creating time factors in PowerBI

Я также нашел эту статью, но это заблуждение:

Power BI Date & Time Dimension Toolkit

Любые идеи?

Спасибо!

ответ

2

Вам понадобится отдельная дата & таблиц времени. Вы не хотите указывать время в таблице даты, потому что время повторяется каждый день.

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

E.g.

Time  | Time Text| Hour | Minute | AM/PM 
---------|----------|------|--------|------ 
12:00 AM | 12:00 AM | 12 | 00  | AM 
12:01 AM | 12:01 AM | 12 | 01  | AM 
12:02 AM | 12:02 AM | 12 | 02  | AM 
...  | ...  | ... | ... | ... 

Я включаю столбец времени/текста, так как у Power BI есть привычка добавлять дату от 1899 до типов данных времени. Вы можете добавить другие столбцы, если они будут вам полезны.

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

Стоит сохранить, но скрывать исходное поле datetime в ваших данных на случай, если позже вы захотите рассчитать продолжительности, которые охватывают дни.

В Power BI вы должны добавить атрибут времени (или атрибут часа (и минуты)) в соответствии с атрибутами месяца/дня на вашей оси, чтобы составить диаграмму столбцов, которая может быть просверлена с года> квартал> месяц> день> час> минут. Power BI не заботится о том, чтобы атрибуты поступали из разных таблиц.

Вы можете прочитать больше о временных измерениях здесь: http://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/

Надеется, что это помогает.

+1

Спасибо. Есть ли способ автоматически генерировать эту таблицу времени? Или он должен быть заполнен вручную? –

+1

Если честно, я обычно собираю его в Excel и загружаю оттуда. Существуют сценарии для создания таких таблиц в SQL (например, http://sqlblog.com/blogs/louis_davidson/archive/2010/02/04/creating-and-using-a-time-not-date-table-dimension.aspx) если это помогает. Как ни странно, похоже, что многие люди не предлагают заранее построенные. – Leonard

3

К сожалению, я не могу прокомментировать предыдущий ответ, так что я должен добавить, как отдельный ответ:

Да, есть способ для автоматического создания даты и времени-таблицы. Вот несколько примеров кода я использую в своих отчетах:

let Source = List.Dates(startDate, Duration.Days(DateTime.Date(DateTime.LocalNow()) - startDate)+1, #duration(1,0,0,0)), convertToTable = Table.FromList(Source, Splitter.SplitByNothing(), {"Date"}, null, ExtraValues.Error), calcDateKey = Table.AddColumn(convertToTable, "DateKey", each Date.ToText([Date], "YYYYMMDD")), yearIndex = Table.AddColumn(calcDateKey, "Year", each Date.Year([Date])), monthIndex = Table.AddColumn(yearIndex, "MonthIndex", each Date.Month([Date])), weekIndex = Table.AddColumn(monthIndex, "WeekIndex", each Date.WeekOfYear([Date])), DayOfWeekIndex = Table.AddColumn(weekIndex, "DayOfWeekIndex", each Date.DayOfWeek([Date], 1)), DayOfMonthIndex = Table.AddColumn(DayOfWeekIndex, "DayOfMonthIndex", each Date.Day([Date])), Weekday = Table.AddColumn(DayOfMonthIndex, "Weekday", each Date.ToText([Date], "dddd")), setDataType = Table.TransformColumnTypes(Weekday,{{"Date", type date}, {"DateKey", type text}, {"Year", Int64.Type}, {"MonthIndex", Int64.Type}, {"WeekIndex", Int64.Type}, {"DayOfWeekIndex", Int64.Type}, {"DayOfMonthIndex", Int64.Type}, {"Weekday", type text}}) in setDataType

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

А вот фрагмент кода для временной таблицы:

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

Если вы используете DateKey и TimeKey (как предложено в первом ответе) в вашем деле стол, вы можете легко создавать дату/time-hierarchy, просто поместив элемент времени в визуализацию ниже элемента даты, подобного этому date-time-hierarchy