CodeGym /コース /SQL SELF /データ分析のためのウィンドウ関数の使い方例

データ分析のためのウィンドウ関数の使い方例

SQL SELF
レベル 30 , レッスン 1
使用可能

じゃあ、いよいよ実践例の世界に飛び込んで、実際の課題でどう動くのか見てみよう!

例:地域ごとの売上ランキング計算

たとえば、salesテーブルがあって、いろんな地域の売上データが入ってるとする。各地域ごとに売上のランクを決めたいんだ。

id region sales_amount
1 North 5000
2 North 3000
3 North 7000
4 South 2000
5 South 4000
6 East 8000
7 East 6000

課題:各地域ごとに売上のランク(RANK)を出す

SELECT
    region,
    sales_amount,
    RANK() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS sales_rank
FROM 
    sales;

結果:

region sales_amount sales_rank
North 7000 1
North 5000 2
North 3000 3
South 4000 1
South 2000 2
East 8000 1
East 6000 2

PARTITION BY regionを使って、各地域ごとにランクを計算してるのがポイント。もしPARTITION BYを使わなかったら、テーブル全体でグローバルにランクが計算されちゃうよ。

例:収入の累積合計を計算する

今度はtransactionsテーブルを使って、各顧客ごとに収入の累積(キュムレイティブ)合計を出してみよう。

id customer_id purchase_date amount
1 101 2023-01-01 100
2 101 2023-01-03 50
3 102 2023-01-02 200
4 101 2023-01-05 150
5 102 2023-01-04 100

課題:各顧客ごとに累積合計を計算する

SELECT
    customer_id,
    purchase_date,
    amount,
    SUM(amount) OVER (PARTITION BY customer_id ORDER BY purchase_date) AS cumulative_sum
FROM 
    transactions;

結果:

customer_id purchase_date amount cumulative_sum
101 2023-01-01 100 100
101 2023-01-03 50 150
101 2023-01-05 150 300
102 2023-01-02 200 200
102 2023-01-04 100 300

ここで大事なのは、OVER()の中でORDER BY purchase_dateを使って、累積合計が時系列順に計算されるようにしてること!

例:データをクォンタイルに分割する

たとえばstudentsテーブルがあって、名前とテストの点数が入ってる。点数で生徒を4つのグループに分けたいとき。

id name test_score
1 Alice 85
2 Bob 95
3 Charlie 75
4 Diana 88
5 Edward 65
6 Fiona 70

課題:NTILE()を使って生徒を4グループに分ける

SELECT
    name,
    test_score,
    NTILE(4) OVER (ORDER BY test_score DESC) AS quartile
FROM 
    students;

クエリの結果はこんな感じ:

name test_score quartile
Bob 95 1
Diana 88 1
Alice 85 2
Charlie 75 3
Fiona 70 3
Edward 65 4

NTILE(4)はデータを4つのグループに分けてくれる。点数が高い生徒は最初のグループ、低い生徒は最後のグループになるよ。

例:時系列データの分析

site_visitsテーブルには、サイトごとの日別訪問数データが入ってる。各サイトごとに日ごとの訪問数の差分を計算したい。

site_id visit_date visits
1 2023-01-01 100
1 2023-01-02 120
1 2023-01-03 110
2 2023-01-01 50
2 2023-01-02 60
2 2023-01-03 70

課題:日ごとの訪問数の差分を計算する

SELECT
    site_id,
    visit_date,
    visits,
    visits - LAG(visits) OVER (PARTITION BY site_id ORDER BY visit_date) AS visit_diff
FROM 
    site_visits;

結果:

site_id visit_date visits visit_diff
1 2023-01-01 100 NULL
1 2023-01-02 120 20
1 2023-01-03 110 -10
2 2023-01-01 50 NULL
2 2023-01-02 60 10
2 2023-01-03 70 10

LAG()関数は前の行の値を取ってこれる。前の行がなかったら、結果はNULLになるよ。詳しくは次のレクチャーで教えるね :P

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION