さがらです。
dbtで定義した複数のMetricsを一度にクエリする方法を試してみたので、本記事でまとめてみます。
事前準備
こちらのリポジトリを使用します。
今回の検証では以下の3つのMetricsを使用します。
- ./models/marts/revenue.yml
version: 2
metrics:
- name: revenue
label: Revenue
model: ref('orders')
description: "The total revenue of our jaffle business"
calculation_method: sum
expression: amount
timestamp: order_date
time_grains: [day, week, month, year]
dimensions:
- customer_status
- had_credit_card_payment
- had_coupon_payment
- had_bank_transfer_payment
- had_gift_card_payment
filters:
- field: status
operator: '='
value: "'completed'"
- ./models/marts/profit.yml
version: 2
metrics:
- name: profit
label: Profit
description: "The total money we get to take home from our jaffle business"
calculation_method: derived
expression: "{{metric('revenue')}} - {{metric('expenses')}}"
timestamp: order_date
time_grains: [hour, day, week, month, year]
dimensions:
- customer_status
- had_coupon_payment
- had_bank_transfer_payment
- had_gift_card_payment
- ./models/marts/expenses.yml
version: 2
metrics:
- name: expenses
label: Expenses
model: ref('orders')
description: "The total expenses of our jaffle business"
calculation_method: sum
expression: amount / 4
timestamp: order_date
time_grains: [day, week, month, year]
dimensions:
- customer_status
- had_credit_card_payment
- had_coupon_payment
- had_bank_transfer_payment
- had_gift_card_payment
filters:
- field: status
operator: '='
value: "'completed'"
複数のMetricsを同時にクエリする方法
複数のMetricsを同時にクエリする方法についてですが、下記のように記述すればOKです!(こちらのdbt Metricsのリポジトリに書いてあります。)
select *
from
{{ metrics.calculate(
[metric('revenue'), metric('expenses')],
grain='day',
dimensions=['customer_status']
)
}}
このクエリを実際に実行してみると、下図のようにrevenue
とexpenses
の値が返ってきました!
ちなみに、3つ以上のMetricsでも問題なく対応可能です。
select *
from
{{ metrics.calculate(
[metric('revenue'), metric('expenses'), metric('average_order_amount')],
grain='week',
dimensions=['customer_status']
)
}}
注意事項
こちらの複数のMetricsを同時にクエリする場合ですが、1つ注意点があります。
それは、クエリするMetrics全てで共通するdimensions
を選択しないといけないことです。
具体的に、revenue.yml
では定義されているがprofit.yml
では定義されていない、had_credit_card_payment
をdimensionsに設定した下記のクエリを実行すると、エラーが返ってきます。
select *
from
{{ metrics.calculate(
[metric('revenue'), metric('profit')],
grain='day',
dimensions=['had_credit_card_payment']
)
}}
この点だけ、注意しましよう!
最後に
dbtで定義した複数のMetricsを一度にクエリする方法を試してみました。
これができれば、複数の指標を用いるグラフでもdbt Semantic Layerを介して作ることが出来ますね!