SnowflakeはANSI SQL完全準拠のクラウドデータプラットフォームであり、標準SQLの知識がそのまま活かせます。さらに、VARIANT型による半構造化データ処理やTime Travelなど、Snowflake独自のSQL拡張機能が豊富に用意されています。
この記事では、Snowflake SQLの実践的な練習問題を難易度別に掲載します。基本的なSELECT/JOINからWindow関数、CTE、Snowflake固有のFLATTEN/VARIANTまで、段階的に実力を伸ばせる構成です。SnowPro試験対策としても活用できます。
SnowflakeはANSI SQLに完全準拠しており、他のRDBMSで培ったSQL知識をそのまま活用できます。SELECT・JOIN・GROUP BY・Window関数・サブクエリなど、標準SQLの構文がすべてサポートされています。Oracle・PostgreSQL・MySQL等からの移行も、SQL構文の面ではスムーズに行えます。
標準SQLに加えて、Snowflakeには以下の独自拡張機能があります。これらはSnowPro試験でも頻出のトピックです。
Snowflakeのクエリエンジンは自動的にマイクロパーティションベースのプルーニングを行い、必要なデータのみを読み込みます。CLUSTER BY(クラスタリングキー)を適切に設定することで、大規模テーブルのスキャン効率が大幅に向上します。また、Result Cacheにより同一クエリの再実行はウェアハウスを消費せずに即座に結果を返します。
まずはSnowflake SQLの基本操作に関する問題です。SELECT・JOIN・GROUP BY・HAVINGなどの標準SQL構文の理解度を確認しましょう。
基本SQL - SELECT / JOIN
問題 1
次のSnowflake SQLクエリの結果として正しいものはどれですか? SELECT o.order_id, c.customer_name, o.total_amount FROM orders o INNER JOIN customers c ON o.customer_id = c.customer_id WHERE o.total_amount > 10000 ORDER BY o.total_amount DESC LIMIT 5;
正解: B
このクエリはINNER JOINでordersとcustomersを結合し、WHERE句でtotal_amount > 10000の条件でフィルタリングします。ORDER BY o.total_amount DESCで金額の降順に並べ、LIMIT 5で上位5件のみを返します。Aは誤りで、WHERE句による金額フィルタがあります。CはGROUP BYによる集計ではなく行レベルのフィルタです。DはINNER JOINであり、LEFT JOINではありません。
基本SQL - GROUP BY / HAVING
問題 2
次のSnowflake SQLクエリの説明として正しいものはどれですか? SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING COUNT(*) >= 5 ORDER BY avg_salary DESC;
正解: B
GROUP BY departmentで部門ごとに集計し、HAVING COUNT(*) >= 5で社員数5人以上の部門のみにフィルタリングします。HAVINGはGROUP BY後の集計結果に対するフィルタであり、WHEREとは適用タイミングが異なります。ORDER BY avg_salary DESCで平均給与の降順に並べます。AはHAVINGフィルタが反映されておらず誤り。CはCOUNTとsalaryの条件を混同しています。DはORDER BYの対象がavg_salaryであり社員数ではありません。
Window関数はSnowflakeのSQLで頻出の重要トピックです。ROW_NUMBER・RANK・DENSE_RANK・LAG・LEAD・SUM OVERなど、分析系SQLの中核を成す機能です。SnowPro試験でも高い確率で出題されます。
Window関数 - ROW_NUMBER / RANK
問題 3
次のSnowflake SQLクエリについて、ROW_NUMBER()とRANK()の違いとして正しい説明はどれですか? SELECT employee_id, department, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_num FROM employees;
正解: B
ROW_NUMBER()は同じ値があっても一意の連番(1,2,3,4...)を振ります。どの行が何番になるかは不定(非決定的)です。一方RANK()は、同じ値の行には同じ順位を付け、次の順位をその分スキップします(例:1,2,2,4)。DENSE_RANK()はスキップせず連番を振ります(例:1,2,2,3)。AはsalaryにNULLや同値がある場合に異なるため誤り。Dは両方ともPARTITION BY句の範囲内で番号を振るため誤りです。
CTE(Common Table Expression)や再帰クエリは、複雑なデータ変換やツリー構造の探索に使われる高度なSQL機能です。Snowflakeは再帰CTEを完全サポートしており、階層データの処理に活用できます。
高度SQL - CTE / 再帰クエリ
問題 4
次のSnowflake SQLクエリ(再帰CTE)の説明として正しいものはどれですか? WITH RECURSIVE org_tree AS ( SELECT employee_id, manager_id, employee_name, 1 AS level FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.employee_id, e.manager_id, e.employee_name, ot.level + 1 FROM employees e INNER JOIN org_tree ot ON e.manager_id = ot.employee_id ) SELECT * FROM org_tree ORDER BY level, employee_name;
正解: B
再帰CTEは「アンカーメンバー(初期条件)」と「再帰メンバー」のUNION ALLで構成されます。アンカーメンバーでmanager_id IS NULL(最上位の社長・CEOなど)をlevel=1として取得し、再帰メンバーで部下をINNER JOINで辿りながらlevelを+1していきます。結果として組織全体のツリー構造がフラットなテーブルとして展開され、各社員の階層レベルが付与されます。Snowflakeでは再帰CTEのデフォルト最大再帰回数は100回です。
FLATTEN関数とVARIANT型は、Snowflakeの最大の特徴である半構造化データ処理の中核です。JSON・Avro・Parquetなどのネストされたデータを、SQLだけで柔軟に展開・クエリできます。SnowPro試験では必須の出題トピックです。
Snowflake固有 - FLATTEN / VARIANT
問題 5
テーブル events にVARIANT型カラム event_data が格納されています。event_data の中身は以下のJSON構造です。 {"user_id": 101, "tags": ["premium", "active", "japan"]} 各タグを個別の行として展開する正しいクエリはどれですか?
正解: A
SnowflakeでVARIANT型のネストされた配列を行に展開するには、LATERAL FLATTEN関数を使用します。FLATTEN(input => event_data:tags)でtags配列の各要素を個別の行に展開し、展開された値はvalue疑似カラムで参照します。コロン記法(event_data:user_id)はVARIANT型のキーアクセス構文です。SPLIT(B)は文字列を分割する関数でVARIANT配列には使えません。UNNEST(C)はSnowflakeではサポートされていません。JSON_EXTRACT(D)はSnowflakeの構文ではありません。
SQLの論理的な実行順序は FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT です。この順序を理解していると、WHERE句とHAVING句の違い、SELECT句でのエイリアスがORDER BYで使える理由など、多くの問題が論理的に解けるようになります。
Snowflake固有のVARIANT型には3つのアクセス記法があります。コロン記法(data:key)、ブラケット記法(data['key'])、ドット記法(data.key)です。配列アクセスはdata:array[0]のようにインデックスを使います。型キャスト(data:key::STRING)と組み合わせた問題が頻出するため、確実にマスターしましょう。
Window関数は「関数名(ROW_NUMBER, RANK等)」「PARTITION BY(グループ分け)」「ORDER BY(並び順)」の3要素で構成されます。PARTITION BYを省略すると全体が1つのウィンドウになり、ORDER BYを省略するとウィンドウ内の順序が不定になります。この3要素の組み合わせを理解すれば、Window関数問題の大半は解けます。
Time TravelはAT(指定時点のデータ)とBEFORE(指定時点の直前のデータ)の2つのキーワードで使い分けます。 タイムスタンプ指定(AT(TIMESTAMP =>'...'))、オフセット指定(AT(OFFSET => -60*5))、ステートメントID指定(BEFORE(STATEMENT => '...'))の3パターンを覚えておけば、Time Travel問題は確実に解けます。
Snowflake SQLは標準SQLとどう違いますか?
SnowflakeはANSI SQL準拠のため、標準SQLの知識がそのまま活かせます。加えて、FLATTEN(半構造化データ展開)、VARIANT型、Time Travel(AT/BEFORE句)、QUALIFY句、LATERAL結合など、Snowflake固有の拡張機能があります。SnowPro試験ではこれらの固有機能が重点的に出題されます。
SQL問題はSnowPro試験のどの程度を占めますか?
SnowPro Core試験ではSQL直接問題は全体の10〜15%程度ですが、ウェアハウス・ステージ・タスクなどの操作でSQL知識が前提となる問題が多く、間接的にはSQL力が合否を大きく左右します。SnowPro Advanced: Data Engineerではより実践的なSQL問題の比率が上がります。
SQL初心者でもSnowflakeの問題に取り組めますか?
はい、基本的なSELECT・WHERE・JOIN・GROUP BYの知識があれば、NicheeLab問題集の基本問題から段階的に学習できます。解説でSQLの構文や動作を丁寧に説明しているため、学びながら実力を伸ばせます。Window関数やCTEは中級以降で取り組むのがおすすめです。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...