この記事はFrosty Friday Advent Calendar 2025に寄稿した記事です。
みんなでFrosty Fridayをやってみよう!
Frosy Fridayとは
Frosty Fridayとは「Snowflakeユーザが、Snowflakeユーザのために作成し、Snowflakeスキルの練習と開発に役立つ」チャレンジです。
原文:
to help you practice and develop your Snowflake skills, created by Snowflake users, for Snowflake users.
こちらのサイトで毎週新しいチャレンジが公開されます。
難易度はBasic/Easy(やさしい)、Intermediate(ほどほど)、Hard/Advanced(むずかしい)の3段階。やさしい問題はSnowflake初心者が勉強するために、ほどほど問題やむずかしい問題はSnowflake経験者が新しい機能を習得するためにちょうどいいものになっています!
Week 149 – Basic
Week 149はパイプ演算子(Flow operators)に関する問題です。
プロシージャが出力するJSONを段階的に整形していくという、非構造化データの文脈でよく見るデータ変換がお題になっています。
私の解答例はこちら。
ポイント解説
与えられたデータ生成プロシージャの出力は規則的な構造になっているため、単純にLATERAL FLATTENすればOKです。
データ生成プロシージャの出力
{
"meta": {
"category": "WIDGETS",
"days": 7,
"start_date": "2025-04-01"
},
"rows": [
{
"category": "WIDGETS",
"date": "2025-04-01",
"day_index": 1,
"moving_avg": 9.703000000000000e+01,
"value": 9.703000000000000e+01
},
{
"category": "WIDGETS",
"date": "2025-04-02",
"day_index": 2,
"moving_avg": 9.648000000000000e+01,
"value": 9.593000000000001e+01
},
{
"category": "WIDGETS",
"date": "2025-04-03",
"day_index": 3,
"moving_avg": 9.758000000000000e+01,
"value": 9.979000000000001e+01
},
{
"category": "WIDGETS",
"date": "2025-04-04",
"day_index": 4,
"moving_avg": 9.870000000000000e+01,
"value": 1.003700000000000e+02
},
{
"category": "WIDGETS",
"date": "2025-04-05",
"day_index": 5,
"moving_avg": 1.011000000000000e+02,
"value": 1.031400000000000e+02
},
{
"category": "WIDGETS",
"date": "2025-04-06",
"day_index": 6,
"moving_avg": 1.027900000000000e+02,
"value": 1.048700000000000e+02
},
{
"category": "WIDGETS",
"date": "2025-04-07",
"day_index": 7,
"moving_avg": 1.036600000000000e+02,
"value": 1.029600000000000e+02
}
]
}
そこで、
- データ生成プロシージャを
CALLで呼ぶ - その出力をパイプ演算子で繋いだSQL文から
$1で参照する -
$1をLATERAL FLATTENした結果に適当な名前を付けて(f) - 各要素にアクセスしていく
のが素直かと思います。
CALL gen_timeseries('2025-04-01'::DATE, 7, 'WIDGETS', 123)
->> SELECT
f.value:date::date AS TS_DATE,
f.value:category::STRING AS CATEGORY,
f.value:value::FLOAT AS VALUE,
f.value:moving_avg::FLOAT AS MOVING_AVG,
f.value:day_index::INTEGER AS DAY_INDEX
FROM $1, LATERAL FLATTEN(INPUT => $1, PATH => 'rows') f
ORDER BY DAY_INDEX;
ね?簡単でしょ?
パイプ演算子とは
こちらの記事がわかりやすいです。
(追記予定)
なお、BigQueryのパイプ構文とは書き方も挙動も異なるので注意が必要です。
BigQueryのパイプ構文は演算(オペレータ)単位で|>を使って繋いでいきますが、Snowflakeのパイプ演算子はSQL文単位で->>で繋いでいきます。
BigQueryのパイプ構文はかなり思想を感じる意欲的な機能ですが、Snowflakeのパイプ演算子は既存のSQLに親しんだデータエンジニアにとって堅実に可読性を高めてくれる機能だと感じました。
まとめ
Frosty FridayはSnowflakeの基本機能や新機能を試すのにちょうどいい内容になっています。
ぜひチャレンジしてみてくださいね!