さがらです。
dbt Metricsで定義した指標に対してWINDOW関数を使うことができるSecondary calculationsを試してみたので、本記事でまとめてみます。
前提
リポジトリは、dbt-labs/jaffle_shop_metricsをforkした以下のリポジトリを用います。
また、以下に実行環境と各製品のバージョンを記しておきます。
- 実行環境:dbt CloudのIDE
- dbt-core:1.3
- dbt-labs/metrics:1.3.2
試してみた
ということで、早速Secondary calculationsを試してみます。
Secondary calculationsの使い方
Secondary calculationsは、実際にmetrics.calculate
マクロを用いてSELECT文を発行するときに使用します。
書き方は下記のような感じで、metrics.calculate
マクロの中でsecondary_calculations
を定義し、各種Secondary calculationsのマクロを使用すればOKです。※Secondary calculationsのマクロの種類と使い方は後述します。
select *
from {{ metrics.calculate(
metric('revenue'),
grain='week',
secondary_calculations = [
metrics.period_over_period(
comparison_strategy = 'difference',
interval = 1,
alias = 'week_over_week'
)
]
) }}
また、secondary_calculations
の中に複数のSecondary calculationのマクロを定義することで、一度に複数のSecondary calculationsを計算することも可能です。
select *
from {{ metrics.calculate(
metric('revenue'),
grain='week',
secondary_calculations = [
metrics.period_over_period(
comparison_strategy = 'difference',
interval = 1,
alias = 'week_over_week'
),
metrics.rolling(
aggregate = 'average',
interval = 4,
alias = 'rolling'
)
]
) }}
Period over Period
Period over Periodは、ある指標について別の期間の値と比較し、割合や差分を出すことが出来るSecondary calculationsです。
metrics.period_over_period
を使用します。このマクロの各種オプションについてはこちらに書いてあります。
以下、コードのサンプルと実際の出力結果です。comparison_strategy = 'difference'
、interval = 1,
とすることで、1つ前の週との差分の値を出しています。
select *
from {{ metrics.calculate(
metric('revenue'),
grain='week',
secondary_calculations = [
metrics.period_over_period(
comparison_strategy = 'difference',
interval = 1,
alias = 'week_over_week'
)
]
) }}
Period to Date
Period to Dateは、元々のmetrics.calculate
のgrain
で指定した期間よりも粗い期間を指定することで、指定した粗い期間の間での最大値・平均値を出すことが出来るSecondary calculationsです。
metrics.period_to_date
を使用します。このマクロの各種オプションについてはこちらに書いてあります。
以下、コードのサンプルと実際の出力結果です。metrics.calculate
でgrain = 'day'
、metrics.period_to_date
でaggregate = 'average'&period = 'month'
とすることで、REVENUE
では日毎のrevenueを返していますが、REVENUE_MONTH_TO_DATE
では各月ごとにその日までのrevenueの平均値を返しています。
Rolling
Rollingは、ある指標について指定したinterval
の行数だけ集計を行った結果を返すことが出来るSecondary calculationsです。
metrics.calculate
を使用します。このマクロの各種オプションについてはこちらに書いてあります。
以下、コードのサンプルと実際の出力結果です。aggregate = 'average'
、interval = 4
とすることで、REVENUE_ROLLING
列では4行分(4週分)のrevenueの平均値を出しています。
select *
from {{ metrics.calculate(
metric('revenue'),
grain = 'week',
secondary_calculations = [
metrics.rolling(
aggregate = 'average',
interval = 4,
alias = 'rolling'
)
]
) }}
Prior
Priorは、ある指標について指定したinterval
の行数だけ遡った値を出すことが出来るSecondary calculationsです。
metrics.prior
を使用します。このマクロの各種オプションについてはこちらに書いてあります。
以下、コードのサンプルと実際の出力結果です。interval = 1
することで、REVENUE_1_WEEKS_PRIOR
では1行前(1週前)のrevenueの値を出しています。
select *
from {{ metrics.calculate(
metric('revenue'),
grain = 'week',
secondary_calculations = [
metrics.prior(
interval = 1,
alias = '1_weeks_prior'
)
]
) }}
最後に
dbt Metricsで定義した指標に対してWINDOW関数を使うことができるSecondary calculationsを試してみました。
少し加筆するだけで、SQLで書くと複雑なWINDOW関数を使えるので非常に便利だなと感じました!