なぜ条件を絞る必要があるか
なぜデータを条件で絞る必要があるかというと、条件を絞ることで、母集団全体だけでなく任意のグループにおける特徴量を出せて、分析アプローチの幅を広げることができるためです。 例えば、売上POSデータから商品データを分析するケースでは、条件を絞り込まずに分析しようとすると、全売上の特徴を出すことしかでませんが、うまく条件で絞り込むことによって「低価格帯における平均売上数」や「特定ブランドの商品における平均単価」のような、任意のグループにおける特徴量を出せることができます。
そういったメリットから、仮説を立ててデータで分析をする際には、データを条件で絞って特定グループにおける特徴量を調べることが多く、実際の現場で多く利用されるという意味でも「データを条件で絞る」ことが重要です。
条件で絞るとはなにか

「条件で絞る」とは、検索条件を指定して、特定のデータを抽出することです。検索条件を指定する際に使用するのが演算子です。これらの手法について説明していきます。
WHERE・HAVINGで絞り込む
WHERE
どういった条件でレコードのデータを取得するかを指定するためには、「WHERE カラム名 演算子 条件」のように、「〇〇カラムが〇〇であるレコード」といった意味になるように条件を指定します。
HAVING
GROUP BYで分類したデータを更に絞り込みたい場合は、HAVINGを用います。「GROUP BY カラム名 HAVING 条件」ようにすることで、条件を満たすグループが取得できます。
WHERE句との違いについてですが、SQLの各コマンドは以下の順番で実行されていて、WHEREは分類される前のテーブル全体を検索対象とするのに対し、HAVINGはGROUP BYによって分類されたデータが検索対象になります。

演算子

AND・OR
AND演算子を使うと、WHEREに複数の条件を指定することができます。「WHERE 条件1 AND 条件2」のようにすることで、条件1と条件2を共に満たすデータを検索することができます。
OR演算子は、AND演算子と同様に、複数の条件を扱います。「WHERE 条件1 OR 条件2」のようにすることで、条件1または条件2のどちらかを満たすデータを検索することができます。
IN
IN演算子を使うと、対象の値が指定した値のリストの中にあるかを判定することができます。「対象 IN(値1, 値2, … 値n)」のようにすることで、指定した値を含むレコードを検索することができます。
BETWEEN
BETWEEN演算子を使うと、対象の値が指定した2つの値の範囲以内にあるかを判定することができます。「WHERE カラム名 BETWEEN 最低値 AND 最大値」のようにすることで、指定の範囲内の値を含むレコードを検索することができます。
LIKE
LIKE演算子を使うと、「ある文字を含むデータ」を取得することができます。「WHERE カラム名 LIKE 文字列」のようにすることで「指定したカラムが〇〇を含むレコード」という条件となります。LIKE演算子を使用する際に覚えておく必要があるのが「ワイルドカード」です。「%」をワイルドカードとして扱います。詳しくはサンプルSQLで見ていきます。
応用例
内部結合(INNER JOIN)
INNER JOINは異なる2つのデータをつなげる際に利用するものですが、 「両方に存在するデータを抽出する結合」のため、片側を「特定のグループ」が含まれるデータにしておくことで、 結果的にデータを絞って「特定グループ」のデータだけを残すことができます。
例えば、全国模試の結果に特定高校の名簿を内部結合することで、特定高校のデータだけに絞る事ができます。 基本的にデータ結合目的がメインとなるため本記事での詳細な説明は省略します。
実際に条件を絞ってみる
準備
- 【パイプライン入門】spreaad sheet to BQを参考にデータを準備
- 【SQL入門】集計してみると同様に、salesテーブルとproductsテーブルをjoinして作ったtest_tableを準備します
サンプルSQL
比較演算子
比較演算子は、値の大小を比較し、その結果を返します。不等号を使い、低価格帯(150円以下)のデータのみ集計します。
SELECT
*
FROM
test_table
WHERE test_table.price < 150;

このように演算子を用いて、条件にマッチしたレコードだけを出すことができます。次はHAVINGを使って、売上が4000円以上の商品を出してみます。
SELECT
test_table.product_id,
test_table.name,
SUM(test_table.Sales) AS Total_Sales
FROM
test_table
GROUP BY
test_table.product_id,
test_table.name
HAVING
SUM(test_table.Sales) > 4000;

4000円以上売り上げているのが、回鍋肉弁当、鮭弁当、炭酸ジュースの3商品であることがわかりました。
次は顧客IDが2のレコードを選択します。
SELECT
*
FROM
test_table
WHERE test_table.user_id = 2;

顧客IDが2のみのレコードを出すことができました。次のように、顧客IDが2以外のレコードを出すこともできます。
SELECT
*
FROM
test_table
WHERE test_table.user_id != 2;

論理演算子
以下のようにANDを使用することで、5個以上売れていて、コストが70円以下のレコードを出すことができます。
SELECT
*
FROM
test_table
WHERE test_table.count >= 5 AND test_table.cost <= 70;


また、ORを使用すれば、どちらかを満たすレコードが出せます。
SELECT
*
FROM
test_table
WHERE test_table.count >= 5 OR test_table.cost <= 70;


どちらかの条件を満たすレコードを出すことができました。
IN演算子
IN演算子は対象の値が指定した値のリストの中にあるかを判定します。商品IDが2,3,5のレコードを選択します。
SELECT
*
FROM
test_table
WHERE test_table.product_id IN(2, 3, 5);

指定した値を含むレコードが出せました。また、IN演算子は以下のように置き換えることもできます。
SELECT
*
FROM
test_table
WHERE test_table.product_id = 2 OR test_table.product_id = 3 OR test_table.product_id = 5;
BETWEEN演算子
次の例では、注文個数が4個以上8個以下のレコードを選択しています。
SELECT
*
FROM
test_table
WHERE test_table.count BETWEEN 4 AND 8;

売上個数が4個以上8個以下のレコードを出すことができました。
LIKE演算子
前方一致
以下のように「〇〇%」とした場合、「〇〇」以降はどんな文字列にも一致するので、「〇〇」で始まる文字列を検索することができます。このような検索を「前方一致」と呼びます。
SELECT
*
FROM
test_table
WHERE test_table.name LIKE"オレンジ%";

このように商品名が「オレンジ〜」のレコードを出すことができました。前方一致なので、「イタリア産オレンジ」のような商品があった場合、このSQLでは出すことができません。
後方一致
以下のように「%〇〇」とした場合、「〇〇」より前はどんな文字列にも一致するので、「〇〇」で終わる文字列を検索することができます。このような検索を「後方一致」と呼びます。
SELECT
*
FROM
test_table
WHERE test_table.name LIKE"%ジュース";

このように商品名が「〜ジュース」のレコードを出すことができました。
部分一致
以下のように「%〇〇%」とした場合、「〇〇」の前後はどんな文字列にも一致するので、「〇〇」を含む文字列を検索することができます。このような検索を「部分一致」と呼びます。
SELECT
*
FROM
test_table
WHERE test_table.name LIKE"%弁当%";

このように商品名が「〜弁当〜」のレコードを出すことができました。
まとめ
サンプルSQLのように、WHERE句・HAVING句と演算子を使用すれば、値の計算や比較を行うことができ、データを絞り込むことができます。
このように条件で絞れば、新たなアプローチで分析を行うことや、より詳細な部分の分析ができます。
コメント