web-dev-qa-db-ja.com

PowerBIの日付階層に「時間」を含める方法

PowerBIでレポートに取り組んでいます。私のデータモデルのテーブルの1つは、センサーデータを収集します。次の列があります。

  • シリアル(int)つまり123456789
  • タイムスタンプ(日時)つまり、2016年12月20日12:04:23 PM
  • 読み取り(10進数)つまり123.456

センサーからの現在の読み取り値とともに、新しいレコードが数分ごとに追加されます。

Power BIは、年、四半期、月、日を含む日時列の階層を自動的に作成します。したがって、レポートにビジュアルを追加すると、これらの各レベルに簡単にドリルダウンできます。

データの「時間」部分を階層に含めて、「日」の後にもう1レベルドリルダウンして、その期間中の詳細な読み取り値を確認できるようにしたいと思います。

CALENDARAUTO()関数を使用してDateテーブルを設定し、適切な列をすべて追加し、日付ごとにデータを要約するために、Readingsテーブルに関連付けました。これは非常に効果的です。ただし、「時間」ディメンションは含まれていません。

私は次のSOの質問を見ましたが、役に立ちませんでした:

Azure DataWarehouseを搭載したPowerBIでの時間ベースのドリルダウン

PowerBIでの時間要素の作成

私もこの記事を見つけましたが、混乱していました:

Power BI Date&Time Dimension Toolkit

何か案は?

ありがとう!

5
Mike Demmons

個別の日付と時刻のテーブルが必要になります。時刻は毎日繰り返されるため、日付テーブルに時刻を入れたくありません。

時間ディメンションは日付ディメンションと同じプリンシパルですが、毎日の行の代わりに、毎分または毎秒の行があります(正確さによって異なりますが、秒を含めることはお勧めしません。必要な行数が大幅に増加し、パフォーマンスに影響するため、絶対に必要でした。タイムテーブルには日付への参照はありません。

例えば。

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年の日付を時刻データ型に追加する習慣があるため、時刻/テキスト列を含めます。他の列も役立つ場合は、他の列を追加できます。

ファクトテーブルでは、日時列を個別の日付と時刻の列に分割して、日付を日付テーブルに、時刻を時刻テーブルに結合できるようにする必要があります。データ内のすべての時間がタイムテーブルの行に対応するように、時間は最も近いラウンド分または秒に変換する必要がある可能性があります。

保持する価値はありますが、後で数日間にわたる期間を計算する場合に備えて、データの元の日時フィールドを非表示にします。

Power BIでは、軸の月/日属性の下に時間属性(または時間(および分)属性)を追加して、年>四半期>月>日>時間>からドリルできる縦棒グラフを作成します。分。 Power BIは、属性が異なるテーブルからのものであることを気にしません。

時間ディメンションの詳細については、こちらをご覧ください: http://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/

お役に立てれば。

2
Leonard

残念ながら、前の回答にコメントすることはできないので、これを別の回答として追加する必要があります。

はい、日付と時刻の表を自動的に生成する方法があります。レポートで使用するコード例を次に示します。

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要素をdate-elementの下に配置するだけで、date/time-hierarchyを簡単に生成できます- date-time-hierarchy

5
Jannis Lietzau

私のアプローチは、与えられた式で新しい列を作成することでした:

<new-column-name>=Format([<your-datetime-column>],"hh:mm:ss")

これにより、新しい列が作成され、your-datetime-columnで選択して、ドリルダウン効果を作成できます。

2
raga

新しいカスタム列を作成し、formula = [Timestamp]を設定し、タイプをdatetimeに変更しました。

#"Added Custom" = Table.AddColumn(#"Added Conditional Column16", "TestTimestamp", each [Timestamp]),
#"Changed Type" = Table.TransformColumnTypes(#"Added Custom",{{"TestTimestamp", type datetime}}),
0
user2330678