【SQL】データサイエンティスト100本ノック、Db2でやってみた(S031-S040の気づき)

かずおじです。データサイエンティスト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 列名 )

参考:PERCENTILE_CONT 集約関数

問題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の気づきを書きます。