❄️

【Frosty Friday Advent Calendar2025】Week125 Advanced Jinja

こんにちわっ、がく@ちゅらデータエンジニアです。

https://qiita.com/advent-calendar/2025/frostyfriday

Frosty Friday Advent Calendar の2日目の記事になります。

Frosty Friday Week125 Advanced Jinja

https://frostyfriday.org/blog/2025/01/03/week-125-advanced/

Frost Frydayには、初級(Base)、中級(Intermediate)、上級(Hard)がありますが、たまーーに、Advanced(=上級相当)がありますね。

このチャレンジは、2025年1月3日に公開されています。
今年のアドベンドカレンダーは、2025年公開分をやっていきたいと思います!

どどーんと神社が・・・・・・
これは日本リスペクトの初詣だからか????

Week125 Advanced Jinja の問題

SQLでJinjaのサポートがされるようになった

https://docs.snowflake.com/en/sql-reference/sql/execute-immediate-from#using-content-from-staged-files-in-a-template

こちらを使ったチャレンジ
チャレンジは2ステップある

  • utils.sql
    • 引数として数字の列([1,2,3,4]のような)
    • それぞれの数値について、オリジナルの数値と2乗の数(2なら2^2=4, 3なら3^2=9)
    • 戻り値はそれぞれの結果をUNIONしたもの
  • main.sql
    • utils.sqlを呼び出すためだけのマクロ
    • [1,2,3,4] という値で utils.sqlをcallするだけのSQL

こんな結果を得ることがゴールですね

EXECUTE IMMEDIATE FROM `@frosty_stage/week125/main.sql`

です。
※stage名、pathは任意でしょう

環境設定

use database gaku_frosty_friday_db;
create or replace schema week125;
use role sysadmin;
use warehouse GAKU_WH;

まずは、Schemaを作っていきましょう。
その他は、すでにあるものを使っています。

解法① SQLで書いてみた(Jinjaを禄に使わない解法)

まず最初に、

-- 単純なSQL
SELECT
  value::number AS original_number,
  original_number * original_number AS squared
FROM
  TABLE(FLATTEN(INPUT => PARSE_JSON('[1,2,3,4]')));

まず、引数として「[1,2,3,4]」という数値のArrayを使って、

  • 数値
  • 数値の2乗
    が出るようにSQLを書いてみました。

TABLE関数とFLATTENを使って展開しています。

次に変数化してみる・・・

-- 引数化
set number_of_array = '[1,2,3,4]';

SELECT
  value::number AS original_number,
  original_number * original_number AS squared
FROM
  TABLE(FLATTEN(INPUT => PARSE_JSON($number_of_array)))
;

ここでは引数を文字列の[1,2,3,4]を想定してやったんですが・・・・

SELECT
  value::NUMBER AS original_number,
  original_number * original_number AS squared
FROM
  TABLE(FLATTEN(INPUT => [1,2,3,4]))
;

引数に数値のArrayを渡しても問題なかった(汗)

ファイルをアップロードします。

今回は、Snowsight(SnowflakeのWebUI)でアップロードします。
先程作ったステージにあげます


左ナビゲーションの Horizon Catalog「Catarog」から、Data Explorer
指定のステージ(今回は GAKU_FROSTY_FRIDAY_DB.WEEK125のStages:WEEK125_STAGE)に
テーブル上部の +Files からファイルをアップしました。


ソースはこちら

Jinja記法!!
Jinja記法っていったらJinja記法!!!!!!!!!!!!!!

実行します

EXECUTE IMMEDIATE FROM @week125_stage/1_utils.sql
    USING (number_of_array=>'[1,2,3,4]');
-- main.sql
EXECUTE IMMEDIATE FROM @week125_stage/main.sql;

こちらでできました!!!!!!!

ちょっと待って
全然Jinja使ってへんやん??????????

解法② Jinjaを”ちゃんと”使う解法

Jinjaは「テンプレートエンジン」!!
テンプレートエンジンなのです。

なので、こちらでやるべきことは、

「Jinjaマクロを作って、SQLを組み立てて、それをSnowflakeが実行する」

select 1 as original_number , original_number * original_number as squared
union all
select 2 as original_number , original_number * original_number as squared
union all
select 3 as original_number , original_number * original_number as squared
union all
select 4 as original_number , original_number * original_number as squared
;

こんなSQLを組み立てるイメージです。
jinjaで生成する

https://github.com/gakut12/Frosty-Friday/blob/main/week125_advanced_jinja/2_utils.sql

やってること

  • select文を出力する
  • ループが最後でなければ「union all」をくっつける

このマクロを読む2_main.sqlはこちら

https://github.com/gakut12/Frosty-Friday/blob/main/week125_advanced_jinja/2_main.sql

EXECUTE IMMEDIATE FROM @week125_stage/2_main.sql
    USING (number_of_array=>'[1,2,3,4]');

成功しました!
Jinjaって言ったらこっちを使わないとねっ(汗)

ちゅらデータ株式会社

Discussion