【Frosty Friday Advent Calendar2025】Week125 Advanced Jinja
こんにちわっ、がく@ちゅらデータエンジニアです。
Frosty Friday Advent Calendar の2日目の記事になります。
Frosty Friday Week125 Advanced Jinja
Frost Frydayには、初級(Base)、中級(Intermediate)、上級(Hard)がありますが、たまーーに、Advanced(=上級相当)がありますね。
このチャレンジは、2025年1月3日に公開されています。
今年のアドベンドカレンダーは、2025年公開分をやっていきたいと思います!

どどーんと神社が・・・・・・
これは日本リスペクトの初詣だからか????
Week125 Advanced Jinja の問題
SQLでJinjaのサポートがされるようになった
こちらを使ったチャレンジ
チャレンジは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で生成する
やってること
- select文を出力する
- ループが最後でなければ「union all」をくっつける
このマクロを読む2_main.sqlはこちら
EXECUTE IMMEDIATE FROM @week125_stage/2_main.sql
USING (number_of_array=>'[1,2,3,4]');

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