dbt Metricsで定義した指標に対してWINDOW関数を使うことができる「Secondary calculations」を試してみた

2023.04.26

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

さがらです。

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.calculategrainで指定した期間よりも粗い期間を指定することで、指定した粗い期間の間での最大値・平均値を出すことが出来るSecondary calculationsです。

metrics.period_to_dateを使用します。このマクロの各種オプションについてはこちらに書いてあります。

以下、コードのサンプルと実際の出力結果です。metrics.calculategrain = '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関数を使えるので非常に便利だなと感じました!