サブクエリ

Snowflake でのデータ操作

Jake Roach

Field Data Engineer

サブクエリとは?

サブクエリは、あるクエリの結果を別のクエリで利用できるようにする手法です。

$$

  • 複数のクエリを組み合わせる
  • 可読性を重視
  • モジュール化を可能にする
  • データ操作を容易にする

$$

FROM ( ... )WHERE ... IN ( ... ) で使用

サブクエリでより可読・モジュール化してデータを処理する流れ

Snowflake でのデータ操作

サブクエリと FROM

SELECT
    ...
-- テーブルではなくクエリ結果から取得
FROM (

    -- メインクエリで使う結果セットを作成
    SELECT 
        <fields>
    FROM <table>
    WHERE ...

);

テーブルから直接ではなく、他のクエリ結果からデータを取得します。

$$

  • 操作と分析を分離
  • クエリの読みやすさ・理解しやすさ向上
  • 「移植性」が高く変更しやすい
  • JOINWHERE などでも利用可
Snowflake でのデータ操作

サブクエリの前

SELECT
    month_num,
    -- ここでは windchill - temperature を2回使用。変更時にどうする?
    AVG(windchill - temperature) AS avg_differential
    MIN(windchill - temperature) AS most_differential
FROM weather
WHERE 
    -- 集計/分析と同じクエリでフィルタしている
    season = 'Winter' AND
    temperature < 32
GROUP BY month_num;
Snowflake でのデータ操作

サブクエリの後

-- まずサブクエリを作り、次に集計

SELECT month_num, AVG(differential) AS avg_differential MIN(differential) AS most_differential FROM (
SELECT month_num, windchill - temperature AS differential FROM weather WHERE season = 'Winter' AND temperature < 32
) GROUP BY month_num;
          | month_num | differential |
          | --------- | ------------ |
          |     12    |      -12     |
          |     1     |      -3      |
          |     1     |       0      |
          |     2     |      -7      |
| month_num | avg_differential | most_differential |
| --------- | ---------------- | ----------------- |
|     12    |       -5.77      |        -14        |
|     1     |       -1.91      |        -8         |
|     2     |       -8.13      |        -22        |

データを整えた後は、分析の理解・変更が容易です。

Snowflake でのデータ操作

WHERE ... IN ( ... )

...

-- サブクエリの結果に含まれる値でフィルタ
WHERE <field> IN (
    SELECT <other-field> FROM ... 


);

変換・フィルタ・操作に使う小さな結果セットを作成します。

$$

  • 非定数の結果セットに対して IN で抽出
  • クエリ内の他の場所でも使用可能
  • AVG, MAX, MIN など
Snowflake でのデータ操作

WHERE ... IN( ... )

SELECT
    todays_date,
    temperature,
    status
FROM weather
WHERE todays_date IN (  -- 勝利したホーム戦の日付でフィルタ

    SELECT
        game_date
    FROM game_schedule
    WHERE stadium = 'Home' AND did_win = TRUE

);
Snowflake でのデータ操作

WHERE ... IN ( ... )

各ホーム試合日の天気データを取得するサブクエリの結果セット

Snowflake でのデータ操作

Passons à la pratique !

Snowflake でのデータ操作

Preparing Video For Download...