かずおじです。データサイエンティスト100本ノックSQL版をDb2 on cloud環境で解いてみました。本記事は問題S031-S040での気づきをまとめました。
【サイトはこちら —> データサイエンス100本ノック(構造化データ加工編)】
【他の記事まとめ —> 【SQL】データサイエンティスト100本ノック、Db2でやってみた(まとめ)】
まとめ(S031-S040)
- STDDEV関数で標準偏差を求めることができる。
- PERCENTILE_CONT関数でパーセンタイル値を求めることができる。
- 結合する構文は以下(INNER/OUTERは省略可能)
- 内部結合:INNER JOIN 〜 ON
- 左外部結合:LEFT OUTER JOIN 〜 ON
- 完全外部結合:FULL OUTER JOIN 〜 ON
- クロス結合:CROSS JOIN 〜
- クロス結合はカンマ区切りと同じ。
標準偏差を求める
STDDEV関数を使用することで標準偏差を出力することができる。
STDDEV( 列名 )
以下のようにDISTINCTをつけると重複を削除した状態で標準偏差を求められる。
STDDEV( DISTINCT 列名 )
参考:STDDEV 集約関数
問題S031
SELECT
STORE_CD,
STDDEV(AMOUNT)
FROM
RECEIPT
GROUP BY
STORE_CD;
パーセンタイル値を求める
PERCENTILE_CONT関数を使用することで標準偏差を出力することができる。
PERCENTILE_CONT( パーセンタイル ) WITHIN GROUP ( ORDER BY 列名 )
問題S031
SELECT
'0' AS PERCENT, PERCENTILE_CONT(0) WITHIN GROUP (ORDER BY AMOUNT) AS PERCENTILE
FROM
RECEIPT
UNION ALL
SELECT
'25' AS PERCENT, PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY AMOUNT) AS PERCENTILE
FROM
RECEIPT
UNION ALL
SELECT
'75' AS PERCENT, PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY AMOUNT) AS PERCENTILE
FROM
RECEIPT
UNION ALL
SELECT
'100' AS PERCENT, PERCENTILE_CONT(1) WITHIN GROUP (ORDER BY AMOUNT) AS PERCENTILE
FROM
RECEIPT;
表を結合する
一般的に以下の結合が使われるっぽい。
- 内部結合
- 左外部結合
- 完全外部結合
- クロス結合
(右外部結合も存在するが今のところ、使いどころがわからない…)
それぞれ以下の構文で書く。ただし、INNER/OUTERは省略可能。
内部結合
列名1 INNER JOIN 列名2 ON 結合条件
左外部結合
列名1 LEFT OUTER JOIN 列名2 ON 結合条件
完全外部結合
列名1 FULL OUTER JOIN 列名2 ON 結合条件
クロス結合
列名1 CROSS JOIN 列名2
問題S036(内部結合)
SELECT
RECEIPT.*,
STORE_NAME
FROM
RECEIPT
INNER JOIN STORE
ON STORE.STORE_CD = RECEIPT.STORE_CD
LIMIT
10;
クロス結合を省略する
上記で記載したクロス結合は以下でも表現できる。
列名1, 列名2
以下と同じ処理を行う。(再掲)可読性を考えるとこちらの方が良いのかな。
列名1 CROSS JOIN 列名2
参考:クロス結合
問題S036(内部結合)
--(省略する場合)
SELECT
COUNT(*)
FROM
STORE, PRODUCT;
--(省略しない場合)
SELECT
COUNT(*)
FROM
STORE
CROSS JOIN PRODUCT;
おわりに
今回は結合がメイントピックでした。データを分析するときとか、使えると便利だと思います。クロス結合はCROSS JOIN が良いのか、省略が良いのか、わからないですが、個人的には、人に見せるコードであれば省略しない、人に見せる予定のない&自分的に省略しても問題ないのであれば省略する、という感じかなと思います。
次は、S041-S050の気づきを書きます。