BigQueryを用いたデータ分析で頻繁に出てくるSQL文をここにまとめます。
各自のデータベースに合わせてお使いください。
##前提
今回用いるテーブルのスキーマとデータ例です。
テーブル名:items
| フィールド名 | データ型 | 説明 |
|---|---|---|
| user_id | STRING | ユーザ ID |
| order_id | STRING | 受注番号 |
| total_price | INTEGER | 購入合計金額 |
| item_id | STRING | 商品 ID |
| item_name | STRING | 商品名 |
| category_name | STRING | カテゴリ名 |
| purchased_at | DATE | 購入日 |
| 行 | user_id | order_id | total_price | item_id | item_name | category_name | purchased_at |
|---|---|---|---|---|---|---|---|
| 1 | 62178 | 272324 | 2780 | 702671 | ピカチュウのぬいぐるみ | ぬいぐるみ | 2021-11-01 |
| 2 | 62178 | 272324 | 3830 | 423852 | ピカチュウの帽子 | 帽子 | 2021-11-01 |
| 3 | 43532 | 272325 | 3830 | 940234 | コダックのぬいぐるみ | ぬいぐるみ | 2021-11-01 |
| 4 | 62178 | 272324 | 2780 | 702671 | ピカチュウのぬいぐるみ | ぬいぐるみ | 2021-11-03 |
| 5 | 28564 | 272327 | 1200 | 435666 | ミュウのキーホルダー | キーホルダー | 2021-11-04 |
| ・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ |
##RFM分析
###R値
欲しい結果:今日の日付から購入日までの日数を算出
R値算出
DATE_DIFF(DATE (CURRENT_DATE("Asia/Tokyo")), CAST (購入日 AS DATE), DAY) AS Recently
例文
SELECT
*,
DATE_DIFF(DATE (CURRENT_DATE("Asia/Tokyo")), CAST (purchased_at AS DATE), DAY) AS Recently
FROM
items
結果(本日が2021/11/11と仮定)
| 行 | user_id | order_id | total_price | item_id | item_name | category_name | purchased_at | Recently |
|---|---|---|---|---|---|---|---|---|
| 1 | 62178 | 272324 | 2780 | 702671 | ピカチュウのぬいぐるみ | ぬいぐるみ | 2021-11-01 | 10 |
| 2 | 62178 | 272324 | 3830 | 423852 | ピカチュウの帽子 | 帽子 | 2021-11-01 | 10 |
| 3 | 43532 | 272325 | 3830 | 940234 | コダックのぬいぐるみ | ぬいぐるみ | 2021-11-01 | 10 |
| 4 | 62178 | 272326 | 2780 | 702671 | ピカチュウのぬいぐるみ | ぬいぐるみ | 2021-11-03 | 7 |
| 5 | 28564 | 272327 | 1200 | 435666 | ミュウのキーホルダー | キーホルダー | 2021-11-04 | 6 |
| ・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ |
###F値
欲しい結果:今日までの購入回数を算出
F値算出
DENSE_RANK() OVER (PARTITION BY ユーザーID ORDER BY 購入日 ASC ) AS Frequency
例文
SELECT
*,
DENSE_RANK() OVER (PARTITION BY user_id ORDER BY purchased_at ASC ) AS Frequency
FROM
items
結果
| 行 | user_id | order_id | total_price | item_id | item_name | category_name | purchased_at | Frequency |
|---|---|---|---|---|---|---|---|---|
| 1 | 62178 | 272324 | 2780 | 702671 | ピカチュウのぬいぐるみ | ぬいぐるみ | 2021-11-01 | 1 |
| 2 | 62178 | 272324 | 3830 | 423852 | ピカチュウの帽子 | 帽子 | 2021-11-01 | 1 |
| 3 | 43532 | 272325 | 3830 | 940234 | コダックのぬいぐるみ | ぬいぐるみ | 2021-11-01 | 1 |
| 4 | 62178 | 272324 | 2780 | 702671 | ピカチュウのぬいぐるみ | ぬいぐるみ | 2021-11-03 | 2 |
| 5 | 28564 | 272327 | 1200 | 435666 | ミュウのキーホルダー | キーホルダー | 2021-11-04 | 1 |
| ・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ |
###M値
例:今日の日付から購入日までの日数を算出
F値算出
SUM(購入額) OVER(PARTITION BY ユーザーID ORDER BY 注文ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Monetary
例文
SELECT
*,
SUM(total_price) OVER(PARTITION BY user_id ORDER BY order_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Monetary
FROM
items
結果
| 行 | user_id | order_id | total_price | item_id | item_name | category_name | purchased_at | Monetary |
|---|---|---|---|---|---|---|---|---|
| 1 | 62178 | 272324 | 2780 | 702671 | ピカチュウのぬいぐるみ | ぬいぐるみ | 2021-11-01 | 2780 |
| 2 | 62178 | 272324 | 3830 | 423852 | ピカチュウの帽子 | 帽子 | 2021-11-01 | 6610 |
| 3 | 43532 | 272325 | 3830 | 940234 | コダックのぬいぐるみ | ぬいぐるみ | 2021-11-01 | 3830 |
| 4 | 62178 | 272324 | 2780 | 702671 | ピカチュウのぬいぐるみ | ぬいぐるみ | 2021-11-03 | 9390 |
| ・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ | ・・・ |