メトリクス ビューの高度なテクニック
メトリクスビューの高度な技術により、移動平均、期間ごとの変化、累計、複雑な派生KPIなどの高度な計算が可能になり、セマンティックレイヤー全体で一貫性と再利用性を維持できます。 このページでは、時系列分析におけるウィンドウ尺度の使用方法と、より単純な尺度から複雑なメトリクスを構築するための構成可能性について説明します。
このページは、基本的なメトリクス ビュー モデリングの概念を理解していることを前提としています。 「メトリクス ビューのモデル化」を参照してください。
このページに掲載されている例では、卸売サプライチェーンをモデル化したTPC-Hサンプルデータセットを使用しています。TPC-H データセットの詳細については、 「 tpch 」を参照してください。 メトリクス ビューでこのデータセットを使用するエンドツーエンドのチュートリアルについては、 「チュートリアル: 結合を使用して完全なメトリクス ビューを構築する」を参照してください。
ウィンドウメジャー
実験段階
この機能は試験的なものです。
ウィンドウメジャーを使用すると、メトリクス ビューでウィンドウ集計、累積集計、または半加算集計を使用してメジャーを定義でき、移動平均、期間ごとの変化、および累積合計などの計算をサポートします。 このセクションには具体的な例が含まれています。
ウィンドウの寸法を定義します
ウィンドウメジャーを使用すると、ウィンドウ集計、累積集計、または半加算集計を用いたメジャーを定義できます。ウィンドウメジャーには、以下の必須値が含まれます。
-
順序 :ウィンドウの順序を決定する寸法。
-
range :ウィンドウの範囲を定義します。例えば、後続データ、累積データ、またはすべてのデータなどです。可能な範囲の値は次のとおりです。
current: ウィンドウ順序値が現在の行の値と等しい行が含まれます。cumulative: ウィンドウ順序付け値が現在の行の値以下であるすべての行が含まれます。trailing <value> <unit>: 現在の行から指定された時間単位数だけ前の行を含みます。たとえば、trailing 3 monthsなどです。これには現行ユニットは含まれません。例えば、trailing 3 months当月を除外します。leading <value> <unit>: 現在の行から指定された時間単位数だけ先の行を含みます。たとえば、leading 7 daysなどです。これには現行ユニットは含まれません。all: ウィンドウ値に関係なく、すべての行が含まれます。
-
semiadditive : クエリの
GROUP BYに順序フィールドが含まれていない場合に、メジャーをどのように集計するかを指定します。可能な値はfirstとlastです。
後続、移動、または先行する窓の測定例
以下の例では、注文を行ったユニーク顧客の7日間移動平均数を算出します。このメトリクスは、各日付までの 1 週間に購入を行った顧客の数を示すことで、長期にわたる顧客エンゲージメントの傾向を追跡するのに役立ちます。
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'
dimensions:
- name: date
expr: o_orderdate
measures:
- name: t7d_customers
expr: COUNT(DISTINCT o_custkey)
window:
- order: date
range: trailing 7 day
semiadditive: last
この例では、以下の設定が適用されます。
- order :
date、日付ディメンションがウィンドウの順序付けを行うことを指定します。 - 範囲 :
trailing 7 day仕様では、ウィンドウは各日付の7日前(日付自体を除く)として定義されます。 - semiadditive :
last、日付がグループ化列でない場合、7 日間のウィンドウ内の最後の値が使用されることを示します。
期間ごとのウィンドウ測定例
次の例では、今日の売上(すべての注文価格の合計)と昨日の売上を比較することで、前日比の売上成長率を計算します。このメトリクスは、毎日の売上傾向を特定し、収益の変化率を示すのに役立ちます。これは、業績のモニタリングや異常の発見に役立ちます。
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'
dimensions:
- name: date
expr: o_orderdate
measures:
- name: previous_day_sales
expr: SUM(o_totalprice)
window:
- order: date
range: trailing 1 day
semiadditive: last
- name: current_day_sales
expr: SUM(o_totalprice)
window:
- order: date
range: current
semiadditive: last
- name: day_over_day_growth
expr: (MEASURE(current_day_sales) - MEASURE(previous_day_sales)) / MEASURE(previous_day_sales) * 100
この例では、以下の条件が適用されます。
-
2つの期間にわたる測定方法が使用されます。1つは前日の総売上高を計算するためのもので、もう1つは当日の総売上高を計算するためのものです。
-
3つ目の指標は、当日と前日の間の変化率(成長率)を算出するものです。
累積(実行)合計値の例
以下の例では、データセットの開始時点から各日付までの累計売上高を計算します。この累計額は、時間の経過とともにどれだけの総収益が生み出されたかを示しており、年間収益目標の達成状況を追跡したり、長期的な成長パターンを分析したりするのに役立ちます。
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1998-01-01'
dimensions:
- name: date
expr: o_orderdate
- name: customer
expr: o_custkey
measures:
- name: running_total_sales
expr: SUM(o_totalprice)
window:
- order: date
range: cumulative
semiadditive: last
以下の詳細は、この定義の重要な部分を強調したものです。
-
order :ウィンドウ内のレコードの順序を定義するディメンションを指定します。この例では、
dateウィンドウを時系列順に並べます。 -
range :
cumulative、データセットの開始時点から各日付までのすべてのデータとしてウィンドウを定義します。 -
半加算型 :
lastクエリにdateが含まれていない場合に、メジャーがどのように集計されるかを制御します。クエリのGROUP BYに日付ディメンションが含まれていない場合、メジャーはすべての日付にわたって合計するのではなく、最後の (最新の) 累積値を返します。
期間累計の測定例
以下の例では、年初来(YTD)の売上高を計算します。この指標は、毎年1月1日から現在までの累計収益を示しており、毎年年初にリセットされます。このメトリクスは、当年度の実績を前年と比較し、年間目標に向けた進捗状況を追跡するために不可欠です。
version: 1.1
source: samples.tpch.orders
filter: o_orderdate > DATE'1997-01-01'
dimensions:
- name: date
expr: o_orderdate
- name: year
expr: DATE_TRUNC('year', o_orderdate)
measures:
- name: ytd_sales
expr: SUM(o_totalprice)
window:
- order: date
range: cumulative
semiadditive: last
- order: year
range: current
semiadditive: last
以下の詳細は、この定義の重要な部分を強調したものです。
-
2つのウィンドウ尺度が使用されています。1つは
date次元の累積合計用で、もう1つは合計をcurrent年に限定するためのものです。 -
year次元は、累積合計を当年度内のみで計算するように制限します。
半加法尺度の例
以下の例ではアカウント残高を計算していますが、日付をまたいで合計してはいけません(月曜日の残高を火曜日の残高に加えて合計残高を求めることはできません)。 その代わりに、複数日にわたって集計する場合、この指標は最新の残高を返します。ただし、この測定値を顧客全体で合計して、特定の日のすべてのアカウントの合計残高を表示することはできます。
version: 1.1
dimensions:
- name: date
expr: date
- name: customer
expr: customer_id
measures:
- name: semiadditive_balance
expr: SUM(balance)
window:
- order: date
range: current
semiadditive: last
以下の詳細は、この定義の重要な部分を強調したものです。
-
order :ウィンドウ内のレコードの順序を定義するディメンションを指定します。この例では、
dateウィンドウを時系列順に並べます。 -
range :
current、ウィンドウを1日に限定し、複数日にわたる集計は行いません。 -
半加算 :
last、複数日にわたって集計する場合、最新の残高を返します。
ウィンドウメジャーを照会する
他のメトリクス ビューと同様に、ウィンドウ メジャーを使用してメトリクス ビューをクエリできます。 次の例では、メトリクス ビューをクエリします。
SELECT
state,
DATE_TRUNC('month', date),
MEASURE(t7d_customers) as m
FROM my_metric_view
WHERE date >= DATE'2024-06-01'
GROUP BY ALL
構成可能性
メトリクス ビューは構成可能です。 ロジックをゼロから書き直すのではなく、既存のディメンションやメジャーを参照する新しいディメンションやメジャーを作成できます。これにより重複が減り、複雑なメトリクス定義の保守が容易になります。
コンポーザビリティは、単一のメトリクス ビュー内とメトリクス ビュー全体の 2 つのレベルで機能します。 メトリクス ビューは別のメトリクス ビューをソースとして使用できるため、ロジックを複製することなく定義を階層化して、より充実したセマンティック モデルを構築できます。
構成可能性は、以下の参照パターンをサポートしています。
- 以前の次元が新たな次元へ。
- 新しい指標における寸法と以前の指標。
- メトリクス ビューのディメンションは、新しいディメンションのソースとして使用されます。
- メトリクス ビューのディメンションとメジャーは、新しいメジャーのソースとして使用されます。
構成可能性を考慮したメジャーを定義する
measuresセクションでは、ソース メトリクス ビューのメジャー、または同じメトリクス ビューで以前に定義されたメジャーを参照できます。 このアプローチにより、セマンティックレイヤーの一貫性、監査可能性、および保守性が向上します。
測定タイプ | 説明 | 例 |
|---|---|---|
アトミック | ソース列に対するシンプルで直接的な集計。これらは構成要素となる。 |
|
作曲 |
|
|
例:平均注文額(AOV)
次の例では、 total_revenue (注文価格の合計)とorder_count (注文数)という2つの基本尺度を使用して平均注文額(AOV)を定義します。avg_order_value尺度は、両方の原子尺度を参照します。
version: 1.1
source: samples.tpch.orders
measures:
# Total Revenue
- name: total_revenue
expr: SUM(o_totalprice)
# Order Count
- name: order_count
expr: COUNT(1)
# Composed Measure: Average Order Value (AOV)
- name: avg_order_value
# Defines AOV as Total Revenue divided by Order Count
expr: MEASURE(total_revenue) / MEASURE(order_count)
total_revenue定義が変更された場合(例えば、税金を除外する場合)、 avg_order_value自動的に更新された定義を使用します。
条件付きロジックによる合成可能性
構成可能性を利用することで、単純な期間比較計算にウィンドウ関数に頼ることなく、複雑な比率、条件付きパーセンテージ、成長率を作成できます。
例:履行率
次の例では、履行率、つまりステータスが'F' (履行済み)の注文の割合を計算します。この指標は、処理済みの注文数を総注文数で割ったものです。
version: 1.1
source: samples.tpch.orders
measures:
# Total Orders (denominator)
- name: total_orders
expr: COUNT(1)
# Fulfilled Orders (numerator)
- name: fulfilled_orders
expr: COUNT(1) FILTER (WHERE o_orderstatus = 'F')
# Composed Measure: Fulfillment Rate (Ratio)
- name: fulfillment_rate
expr: MEASURE(fulfilled_orders) / MEASURE(total_orders)
format:
type: percentage
構成可能性に関するベストプラクティス
- まず原子尺度を定義します : それらを参照する尺度を定義する前に、基本尺度 (
SUM、COUNT、AVG) を確立します。 - 参照には
MEASURE()使用します 。exprで別の小節を参照する場合は、MEASURE()関数を使用します。集計ロジックを手動で繰り返さないでください。例えば、両方の値に対する対策が既に存在する場合は、SUM(a) / COUNT(b)を避けてください。 - 読みやすさを優先する :明確な数式を用いて指標を作成する。例えば、
MEASURE(gross_profit) / MEASURE(total_revenue)は単一の複雑な SQL 式よりも分かりやすい。 - セマンティックメタデータを追加する :セマンティックメタデータを使用して、複合的な測定値(例えば、パーセンテージや通貨)を下流のツール向けにフォーマットします。「メトリクス ビューのエージェント メタデータ」を参照してください。