SQL Academy · レッスン

よくある日付レポート(MTD、WoW、YoY)

date_truncと自己結合またはウィンドウ関数を使って、月初来、前週比、前年比のレポートを作成します。

レッスン 4/413 ステップ

「よくある日付レポート(MTD、WoW、YoY)」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

3つの基本的な期間レポート

ほぼすべてのビジネスダッシュボードで、次の集計が必要になります。

  • MTD — 月初来
  • WoW — 前週比
  • YoY — 前年同期比

月初来

今月の現時点までの合計です。

SELECT SUM(total) AS mtd_revenue
FROM orders
WHERE created_at >= date_trunc('month', NOW())
  AND created_at <  date_trunc('month', NOW()) + INTERVAL '1 month';

年初来

同じパターンを年単位で適用します。

SELECT SUM(total) AS ytd_revenue
FROM orders
WHERE created_at >= date_trunc('year', NOW());

前週比

今週と前週を比較します。

SELECT
  SUM(total) FILTER (
    WHERE created_at >= date_trunc('week', NOW())
  ) AS this_week,
  SUM(total) FILTER (
    WHERE created_at >= date_trunc('week', NOW()) - INTERVAL '1 week'
      AND created_at <  date_trunc('week', NOW())
  ) AS last_week
FROM orders
WHERE created_at >= date_trunc('week', NOW()) - INTERVAL '1 week';

前年同期比

同じ期間を前年の同じ期間と比較します。

SELECT date_trunc('month', created_at) AS month, SUM(total)
FROM orders
WHERE created_at >= NOW() - INTERVAL '2 years'
GROUP BY 1
ORDER BY 1;

-- Then plot with two lines: current year, previous year.

欠損のない日次系列

ある日に注文がなければ、GROUP BYはその日を省略します。完全なカレンダー系列を生成し、LEFT JOINします。

SELECT day, COALESCE(SUM(o.total), 0) AS revenue
FROM generate_series(
  CURRENT_DATE - INTERVAL '30 days',
  CURRENT_DATE,
  INTERVAL '1 day'
) AS day
LEFT JOIN orders o ON date_trunc('day', o.created_at) = day
GROUP BY day
ORDER BY day;

累積合計

ウィンドウ関数を使うと、自己結合なしで累積合計を計算できます。

SELECT day,
       revenue,
       SUM(revenue) OVER (ORDER BY day) AS running_total
FROM daily_revenue
ORDER BY day;

期間ごとの差分

LAGを使って前年同期比の成長率を計算します。

SELECT month,
       revenue,
       LAG(revenue, 12) OVER (ORDER BY month) AS prev_year,
       (revenue - LAG(revenue, 12) OVER (ORDER BY month))
         / NULLIF(LAG(revenue, 12) OVER (ORDER BY month), 0) AS yoy_growth
FROM monthly_revenue;

直近7日/30日(移動ウィンドウ)

移動ウィンドウと暦に合わせた集計は異なります。ビジネス上の意味に合う方を選択してください。

-- Trailing 7 days, ending now:
WHERE created_at >= NOW() - INTERVAL '7 days';

-- This calendar week, from Monday:
WHERE created_at >= date_trunc('week', NOW());

タイムゾーンに関する考慮事項

「今日」はユーザーのタイムゾーンによって異なります。切り捨てる前に変換してください。

SELECT date_trunc('day', created_at AT TIME ZONE 'America/Los_Angeles') AS la_day,
       COUNT(*)
FROM events
GROUP BY 1;

マテリアライズドビューによる事前集計

ページを読み込むたびにレポートを実行する場合は、1日1回だけマテリアライズしてください。詳しくはMaterialized Viewsで扱います。

振り返り

期間レポートはいくつかのパターンを基盤にしています。

  • date_truncを使った半開区間
  • 期間ごとのバケットを並行して作るFILTER
  • 欠損日の補完にはgenerate_series + LEFT JOIN
  • 期間ごとの差分にはLAG

確認問題

「今月の最初の瞬間」を示す式はどれですか?

無料で開始

AI チューターと学ぶ SQL — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
46
レッスン
183

よくある質問

「よくある日付レポート(MTD、WoW、YoY)」レッスンは無料ですか?

はい。「よくある日付レポート(MTD、WoW、YoY)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「よくある日付レポート(MTD、WoW、YoY)」で何を学びますか?

date_truncと自己結合またはウィンドウ関数を使って、月初来、前週比、前年比のレポートを作成します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「よくある日付レポート(MTD、WoW、YoY)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 日付計算とINTERVAL
  2. EXTRACT、DATE_TRUNC、AGE
  3. タイムゾーン:TIMESTAMPとTIMESTAMPTZ
  4. よくある日付レポート(MTD、WoW、YoY)
← SQL Academyに戻る