dbtで定義した複数のMetricsを一度にクエリしてみた

2023.04.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

さがらです。

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']
      )
  }}

このクエリを実際に実行してみると、下図のようにrevenueexpensesの値が返ってきました!

ちなみに、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を介して作ることが出来ますね!