Snowflake

Snowflake SQL問題集|実践的な練習問題と

2026-03-20
NicheeLab編集部

SnowflakeはANSI SQL完全準拠のクラウドデータプラットフォームであり、標準SQLの知識がそのまま活かせます。さらに、VARIANT型による半構造化データ処理やTime Travelなど、Snowflake独自のSQL拡張機能が豊富に用意されています。

この記事では、Snowflake SQLの実践的な練習問題を難易度別に掲載します。基本的なSELECT/JOINからWindow関数、CTE、Snowflake固有のFLATTEN/VARIANTまで、段階的に実力を伸ばせる構成です。SnowPro試験対策としても活用できます。

Snowflake SQLの特徴

ANSI SQL完全準拠

SnowflakeはANSI SQLに完全準拠しており、他のRDBMSで培ったSQL知識をそのまま活用できます。SELECT・JOIN・GROUP BY・Window関数・サブクエリなど、標準SQLの構文がすべてサポートされています。Oracle・PostgreSQL・MySQL等からの移行も、SQL構文の面ではスムーズに行えます。

Snowflake固有の拡張機能

標準SQLに加えて、Snowflakeには以下の独自拡張機能があります。これらはSnowPro試験でも頻出のトピックです。

  • VARIANT / OBJECT / ARRAY型:JSON・Avro・Parquetなどの半構造化データをネイティブに格納・クエリ可能
  • FLATTEN関数:ネストされた半構造化データを行に展開し、リレーショナルなクエリを実行
  • Time Travel(AT / BEFORE句):過去の任意の時点のデータにアクセスし、誤操作からの復旧やデータ比較が可能
  • QUALIFY句:Window関数の結果に対してフィルタリングを行う、Snowflake固有の句
  • LATERAL結合:FLATTENと組み合わせて半構造化データを効率的に展開
  • GENERATOR / TABLE関数:テストデータの生成やシーケンスの作成に利用

クエリ最適化の特徴

Snowflakeのクエリエンジンは自動的にマイクロパーティションベースのプルーニングを行い、必要なデータのみを読み込みます。CLUSTER BY(クラスタリングキー)を適切に設定することで、大規模テーブルのスキャン効率が大幅に向上します。また、Result Cacheにより同一クエリの再実行はウェアハウスを消費せずに即座に結果を返します。

基本SQL問題

まずは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;

  1. 全顧客の注文を金額の降順で5件取得する
  2. 注文金額が10,000を超える注文を金額の降順で上位5件取得する
  3. 顧客ごとの合計注文金額が10,000を超えるものを5件取得する
  4. 注文テーブルと顧客テーブルのLEFT JOINで上位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;

  1. 全部門の社員数と平均給与を平均給与の降順で表示する
  2. 社員数5人以上の部門について、社員数と平均給与を平均給与の降順で表示する
  3. 給与が5以上の社員がいる部門を表示する
  4. 社員数5人以上の部門について、社員数と平均給与を社員数の降順で表示する

正解: 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関数問題

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;

  1. ROW_NUMBERとRANKは常に同じ値を返す
  2. ROW_NUMBERは一意の連番を振り、RANKは同一値に同じ順位を付けて次の順位をスキップする
  3. ROW_NUMBERはNULLを無視し、RANKはNULLを含める
  4. ROW_NUMBERはパーティション全体で通し番号を振り、RANKはパーティションごとに番号を振る

正解: B

ROW_NUMBER()は同じ値があっても一意の連番(1,2,3,4...)を振ります。どの行が何番になるかは不定(非決定的)です。一方RANK()は、同じ値の行には同じ順位を付け、次の順位をその分スキップします(例:1,2,2,4)。DENSE_RANK()はスキップせず連番を振ります(例:1,2,2,3)。AはsalaryにNULLや同値がある場合に異なるため誤り。Dは両方ともPARTITION BY句の範囲内で番号を振るため誤りです。

高度なSQL問題

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;

  1. 全社員をランダムな順序で取得する
  2. manager_idがNULLの社員(トップ)を起点に、組織階層を再帰的にたどって全社員をレベル付きで取得する
  3. 社員テーブルの自己結合で同じ部門の社員ペアを生成する
  4. manager_idがNULLの社員のみを取得する

正解: B

再帰CTEは「アンカーメンバー(初期条件)」と「再帰メンバー」のUNION ALLで構成されます。アンカーメンバーでmanager_id IS NULL(最上位の社長・CEOなど)をlevel=1として取得し、再帰メンバーで部下をINNER JOINで辿りながらlevelを+1していきます。結果として組織全体のツリー構造がフラットなテーブルとして展開され、各社員の階層レベルが付与されます。Snowflakeでは再帰CTEのデフォルト最大再帰回数は100回です。

Snowflake固有SQL

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"]} 各タグを個別の行として展開する正しいクエリはどれですか?

  1. SELECT event_data:user_id, value AS tag FROM events, LATERAL FLATTEN(input => event_data:tags)
  2. SELECT event_data:user_id, SPLIT(event_data:tags, ',') AS tag FROM events
  3. SELECT event_data:user_id, UNNEST(event_data:tags) AS tag FROM events
  4. SELECT event_data:user_id, JSON_EXTRACT(event_data, '$.tags[*]') AS tag FROM events

正解: 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問題攻略のコツ

クエリの実行順序を意識する

SQLの論理的な実行順序は FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT です。この順序を理解していると、WHERE句とHAVING句の違い、SELECT句でのエイリアスがORDER BYで使える理由など、多くの問題が論理的に解けるようになります。

VARIANT型のアクセス記法を覚える

Snowflake固有のVARIANT型には3つのアクセス記法があります。コロン記法(data:key)、ブラケット記法(data['key'])、ドット記法(data.key)です。配列アクセスはdata:array[0]のようにインデックスを使います。型キャスト(data:key::STRING)と組み合わせた問題が頻出するため、確実にマスターしましょう。

Window関数の3要素を押さえる

Window関数は「関数名(ROW_NUMBER, RANK等)」「PARTITION BY(グループ分け)」「ORDER BY(並び順)」の3要素で構成されます。PARTITION BYを省略すると全体が1つのウィンドウになり、ORDER BYを省略するとウィンドウ内の順序が不定になります。この3要素の組み合わせを理解すれば、Window関数問題の大半は解けます。

Time Travel構文をセットで覚える

Time TravelはAT(指定時点のデータ)とBEFORE(指定時点の直前のデータ)の2つのキーワードで使い分けます。 タイムスタンプ指定(AT(TIMESTAMP =>'...'))、オフセット指定(AT(OFFSET => -60*5))、ステートメントID指定(BEFORE(STATEMENT => '...'))の3パターンを覚えておけば、Time Travel問題は確実に解けます。

よくある質問(FAQ)

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は中級以降で取り組むのがおすすめです。

Snowflake SQL問題をもっと解こう

日本語の詳細解説付きで、Snowflake SQLの実力を効率的に伸ばせます

無料で問題を解く

Snowflake資格の関連記事

Snowflake無料問題集

全11資格対応の日本語練習問題

Snowflake試験の日本語対応

全11試験の言語対応状況と英語攻略法

Snowflake試験の合格率

合格ライン・推定合格率・対策を解説

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.