🕌

redshiftで年度を求めるSQLを書いてみる

2024/09/14に公開

はじめに

こんにちは。(心の内では)健康を目指して日々精進しているshimojです。
普段はDWHであるRedshfitをメインにデータ分析基盤周りの業務に携わっております。
今回は、登録された日付データから年度を求めるクエリを作成したので内容をまとめたいと思います。

やりたいこと

2024年度は「2024年4月1日〜2025年3月31日」になりますので、この範囲の年度は「2024」になります。
「2024年4月1日~2024年12月31日」は年部分を取得することで「2024」になります。
しかし、「2025年1月1日~2025年3月31日」の期間は「2025」となります。

そのため、以下表のように対象日から適切な「対象日の年度」を取得するクエリを作成します。
以下表のような指定日に対して、取得年度と年度開始日、年度終了日を求めたいと思います。

対象日 対象の年 対象日の年度
2024-03-31 2024 2023
2024-04-01 2024 2024
2024-12-31 2024 2024
2025-01-01 2025 2024
2025-03-31 2025 2024
2025-04-01 2025 2025

処理

目的の表にも記載したように、1月1日〜3月31日は翌年の値になります。
判定は、対象日の日付から「月日」を取得し、年度の始まりである「0401」と比較し求めます。

  • 対象の月日が「0401」以上の場合: 対象の年をそのまま出力
  • 対象の月日が「0401」未満の場合: 対象の年から-1を実施して出力

作成コード

では作成したクエリを記載します。
なお対象年はサブクエリにて作成し、年度開始日を「target_month_day」として出力します。

SELECT
  "対象日"
, '0401' AS target_month_day  -- 出力結果1
-- , '0301' AS target_month_day  -- 出力結果2
, EXTRACT(year FROM "対象日") AS "対象の年"
, TO_CHAR("対象日", 'MMDD')   AS "対象の月日"
, CASE WHEN "対象の月日" >= target_month_day 
       THEN "対象の年"
       ELSE "対象の年" - 1
       END AS "対象日の年度"
, ("対象日の年度"::varchar + target_month_day)::date          AS "年度開始日"  -- 処理開始日({実行年度-{target_month_dayの月日})
, ("年度開始日" + INTERVAL '1 year' - INTERVAL '1 day')::date AS "年度終了日"  -- 処理終了日(「年度開始日」+1年-1日)
FROM (
-- 対象日
  SELECT '2024-03-31'::date AS "対象日"
  UNION ALL
  SELECT '2024-04-01'::date
  UNION ALL
  SELECT '2024-12-31'::date
  UNION ALL
  SELECT '2025-01-01'::date
  UNION ALL
  SELECT '2025-03-31'::date
  UNION ALL
  SELECT '2025-04-01'::date
);

出力結果1

それでは、年度開始日(target_month_day)を「4月1日(0401)」とした出力の結果を表に記載します。
結果より、「対象日の年度」と「年度開始日、年度終了日」が取得できたことを確認しました。

対象日 対象年 対象月日 対象日の年度 年度開始日 年度終了日
2024-03-31 2024 0331 2023 2023-04-01 2024-03-31
2024-04-01 2024 0401 2024 2024-04-01 2025-03-31
2024-12-31 2024 1231 2024 2024-04-01 2025-03-31
2025-01-01 2025 0101 2024 2024-04-01 2025-03-31
2025-03-31 2025 0331 2024 2024-04-01 2025-03-31
2025-04-01 2025 0401 2025 2025-04-01 2026-03-31

出力結果2

続いて、年度開始日(target_month_day)を「3月1日(0301)」とした出力の結果を表に記載します。
結果より、「対象日の年度」と「年度開始日、年度終了日」が取得できたことを確認しました。

対象日 対象年 対象月日 対象日の年度 年度開始日 年度終了日
2024-03-31 2024 0331 2024 2024-03-01 2025-02-28
2024-04-01 2024 0401 2024 2024-03-01 2025-02-28
2024-12-31 2024 1231 2024 2024-03-01 2025-02-28
2025-01-01 2025 0101 2024 2024-03-01 2025-02-28
2025-03-31 2025 0331 2025 2025-03-01 2026-02-28
2025-04-01 2025 0401 2025 2025-03-01 2026-02-28

まとめ

対象日の日付から「年度」を求めるクエリを作成しました。
集計期間が指定される場合、対象のマスターカレンダーを保持しているケースもありますが、カラム値を変更することで年度の開始終了日がわかると少し幸せになれるかなと思いました。
この記事がどなたかの助けになれば幸いです。

GitHubで編集を提案

Discussion