dbtで定義した複数のMetricsを一度にクエリしてみた
さがらです。
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を介して作ることが出来ますね!