redshiftで年度を求めるSQLを書いてみる
はじめに
こんにちは。(心の内では)健康を目指して日々精進している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 |
まとめ
対象日の日付から「年度」を求めるクエリを作成しました。
集計期間が指定される場合、対象のマスターカレンダーを保持しているケースもありますが、カラム値を変更することで年度の開始終了日がわかると少し幸せになれるかなと思いました。
この記事がどなたかの助けになれば幸いです。
Discussion