便利な関数の概要

SQLでビジネスデータを分析する

Michel Semaan

Data Scientist

日付の扱い

  • DATE_TRUNC('quarter', '2018-08-13')'2018-07-01 00:00:00+00:00'
  • '2018-07-01 00:00:00+00:00' :: DATE'2018-07-01'

レポートの日時

  • 可読性の高い日付はレポートで重要です
  • 既定の形式 '2018-08-13' は読みやすくありません
  • '2018-08-13' から 'Friday 13, August 2018' にするには?

解決策

  • TO_CHAR('2018-08-13', 'FMDay DD, FMMonth YYYY')'Friday 13, August 2018'
SQLでビジネスデータを分析する

TO_CHAR()

  • TO_CHAR(DATE, TEXT) → TEXT(整形された日付文字列)
  • : Dy → 曜日の略称(MonTues など)

    • TO_CHAR('2018-06-01', 'Dy') → 'Fri'
    • TO_CHAR('2018-06-02', 'Dy') → 'Sat'
  • フォーマット文字列のパターンは日付の要素に置換され、その他はそのまま残ります

  • : DD → 日(01 - 31
    • TO_CHAR('2018-06-01', 'Dy - DD') → 'Fri - 01'
    • TO_CHAR('2018-06-02', 'Dy - DD') → 'Sat - 02'
SQLでビジネスデータを分析する
Pattern 説明
FMDay 曜日の完全名(MondayTuesday など)
MM 月(01 - 12
Mon 月の略称(JanFeb など)
FMMonth 月名の完全名(JanuaryFebruary など)
YY 年の下2桁(1819 など)
YYYY 西暦4桁(20182019 など)

ドキュメント: https://www.postgresql.org/docs/9.6/functions-formatting.html

SQLでビジネスデータを分析する

クエリ

SELECT DISTINCT
  order_date,
  TO_CHAR(order_date,
          'FMDay DD, FMMonth YYYY') AS format_1,
  TO_CHAR(order_date,
          'Dy DD Mon/YYYY') AS format_2
FROM orders
ORDER BY order_date ASC
LIMIT 3;

結果

order_date  format_1                format_2       
----------  ----------------------  ---------------
2018-06-01  Friday 01, June 2018    Fri 01/Jun 2018
2018-06-02  Saturday 02, June 2018  Sat 02/Jun 2018
2018-06-02  Sunday 03, June 2018    Sun 03/Jun 2018
SQLでビジネスデータを分析する

ウィンドウ関数の復習

  • SUM(...) OVER (...): 列の累計を計算します
    • : SUM(registrations) OVER (ORDER BY registration_month) は登録数の累計を計算
  • LAG(...) OVER (...): 直前行の値を取得します
    • : LAG(mau) OVER (ORDER BY active_month) は前月のアクティブユーザー(MAU)を返す
  • RANK() OVER (...): 並び順に基づき各行に順位を付与します
    • : RANK() OVER (ORDER BY revenue DESC) は売上に基づきユーザー、店舗、月をランキング
SQLでビジネスデータを分析する

クエリ

SELECT
  user_id,
  SUM(meal_price * order_quantity) AS revenue
FROM meals
JOIN orders ON meals.meal_id = orders.meal_id
GROUP BY user_id
ORDER BY revenue DESC
LIMIT 3;

結果

user_id  revenue
-------  -------
18       626
76       553.25
73       537
SQLでビジネスデータを分析する

クエリ

WITH user_revenues AS (
  SELECT
    user_id,
    SUM(meal_price * order_quantity) AS revenue
  FROM meals
  JOIN orders ON meals.meal_id = orders.meal_id
  GROUP BY user_id)

SELECT
  user_id,
  RANK() OVER (ORDER BY revenue DESC)
    AS revenue_rank
FROM user_revenues
ORDER BY revenue_rank DESC
LIMIT 3;

結果

user_id  revenue_rank
-------  ------------
18       1
76       2
73       3
SQLでビジネスデータを分析する

便利な関数の概要

SQLでビジネスデータを分析する

Preparing Video For Download...