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

かずおじです。データサイエンティスト100本ノックSQL版Db2 on cloud環境で解いてみました。本記事は問題S001-S020での気づきをまとめました。

【サイトはこちら —> データサイエンス100本ノック(構造化データ加工編)

【他の記事まとめ —> 【SQL】データサイエンティスト100本ノック、Db2でやってみた(まとめ)

気づきまとめ(S001-020)

  • 前半は基本的な構文。(LIKE文で条件指定など)
  • REGEXP_LIKE関数で正規表現を使った条件指定ができる。
  • 「FETCH FIRST [行数] ROWS ONLY」= LIMIT句 である。
  • 「RANK() OVER(ORDER BY [列名])」でランク付ができる。

行数指定(共通)

Db2での行数指定は、「FETCH FIRST [行数] ROWS ONLY」だが、MySQLの「LIMIT句」も使用可能。私の感覚だと、LIMIT句の方がラク。

問題S001

FETCH FIRST…の場合

SELECT
    *
FROM
    RECEIPT
FETCH FIRST 10 ROWS ONLY;

LIMIT句の場合

SELECT
    *
FROM
    RECEIPT
LIMIT
    10;

正規表現を使った条件指定(S013-S016)

LIKE文は基本的な構文だが、REGEXP_LIKE関数を使用して、正規表現を使って条件指定可能。

REGEXP_LIKE( 列名, 正規表現 )

参照: REGEXP_LIKE 述部

ただし、LIKE文とは書き方とは異なるため、注意。

問題S013

SELECT
    *
FROM
   CUSTOMER
WHERE
    REGEXP_LIKE(STATUS_CD,'^[A-F]')
LIMIT
    10;

ランク付け(S019-S020)

OLAP関数のRANK()を使用して、ランキング番号を付与することができる。

RANK() OVER(ORDER BY 列名)

(降順の場合)

RANK() OVER(ORDER BY 列名 DESC)

参考:OLAP 指定

問題S019

SELECT 
    RANK() OVER(ORDER BY AMOUNT DESC) AS RANKING,
    CUSTOMER_ID, AMOUNT 
FROM 
    RECEIPT
LIMIT
    10;

おわりに

今回は最初の問題だったので、基礎的な内容でしたが、意外と知らないこともありました。特にREGEXP_LIKE関数は知らなかったし、今後使えそうだなと思いました。

次は、問題S021-問題S030についての気付きをまとめます。