Mik*_*ons 8 datetime data-modeling powerbi
我正在 Power BI 中处理一份报告。我的数据模型中的一个表收集传感器数据。它具有以下列:
每隔几分钟就会添加一条新记录,其中包含传感器的当前读数。
Power BI 自动为日期时间列创建层次结构,其中包括年、季度、月和日。因此,当您向报告添加视觉对象时,您可以轻松深入到每个级别。
我想在层次结构中包含数据的“时间”部分,以便您可以在“天”之后再向下钻取一层,并查看该时间段的详细读数。
我已经使用 CALENDARAUTO() 函数设置了一个日期表,添加了所有适当的列,并将其与我的读数表相关联,以便按日期汇总数据 - 效果很好。但它不包括“时间”维度。
我查看了以下 SO 问题,但它们没有帮助:
由 Azure 数据仓库提供支持的 Power BI 中基于时间的钻取
我也找到了这篇文章,但它令人困惑:
有任何想法吗?
谢谢!
小智 5
不幸的是,我无法对之前的答案发表评论,因此我必须将其添加为单独的答案:
是的,有一种方法可以自动生成日期和时间表。这是我在报告中使用的一些示例代码:
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
Run Code Online (Sandbox Code Playgroud)
只需将其粘贴到空查询中即可。该代码使用了一个名为 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
Run Code Online (Sandbox Code Playgroud)
如果您在事实表中使用 DateKey 和 TimeKey(如第一个答案中建议的那样),则只需将时间元素放在可视化中的日期元素下方,就可以轻松生成日期/时间层次结构,例如此 日期-时间层次
我的方法是使用给定的公式创建新列:
<new-column-name>=Format([<your-datetime-column>],"hh:mm:ss")
Run Code Online (Sandbox Code Playgroud)
这将创建一个新列,现在您可以使用 your-datetime-column 选择它以创建向下钻取效果。
您将需要单独的日期和时间表。您不想将时间放入日期表中,因为时间每天都会重复。
时间维度与日期维度的原理相同,只不过不是每天一行,而是每分钟或每秒一行(取决于您想要的精确程度 - 我不建议包括秒,除非您绝对需要它,因为它大大增加了您需要的行数 - 影响性能)。时间表中不会提及日期。
例如
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
... | ... | ... | ... | ...
Run Code Online (Sandbox Code Playgroud)
我添加了时间/文本列,因为 Power BI 习惯将 1899 年以来的日期添加到时间数据类型。如果其他列对您也有帮助,您可以添加它们。
在事实表中,您需要将日期时间列拆分为单独的日期和时间列,以便可以将日期连接到日期表,将时间连接到时间表。该时间可能需要转换为最接近的分钟或秒,以便数据中的每个时间都对应于时间表中的一行。
保留但隐藏数据中的原始日期时间字段是值得的,以防您以后想要计算跨天的持续时间。
在 Power BI 中,您可以在轴上的月/日属性下添加时间属性(或小时(和分钟)属性),以制作可以从年 > 季度 > 月 > 日 > 小时 > 进行钻取的柱形图。分钟。Power BI 不关心属性来自不同的表。
您可以在此处阅读有关时间维度的更多信息:http ://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
23226 次 |
| 最近记录: |