こんにちは、ミナピピン(@python_mllover)です。仕事でよくイベントのログからユーザーごとのイベント獲得ポイントを抽出し順位付けをすることがあるので、今回はその時に使うクエリをメモしておこうと思います。
サンプルデータ
| date | user_id | point |
| 2021/1/3 | 0 | 764 |
| 2021/1/1 | 1 | 696 |
| 2021/1/5 | 2 | 633 |
| 2021/1/1 | 3 | 226 |
| 2021/1/4 | 4 | 140 |
| 2021/1/2 | 5 | 683 |
| 2021/1/1 | 6 | 594 |
| 2021/1/3 | 7 | 930 |
| 2021/1/1 | 8 | 916 |
| 2021/1/2 | 9 | 105 |
<作成コード>
import random
import datetime
import pandas as pd
now = datetime.datetime.now()
data = []
for i in range(10):
rand_datetime = now.replace(day=random.randint(1,5), hour=0, minute=0, second=0, microsecond=0)
id_ = i
point = random.randint(100,1000)
data.append([rand_datetime, id_, point])
pd.DataFrame(data,columns=['date', 'user_id', 'point']).to_csv('user_point.csv',index=False)
rownumberで順位付けする
順位付けは分析関数を使用することで実装可能です。
SELECT
user_id
,rank_
,CASE WHEN rank_ BETWEEN 1 AND 3 THEN "1-3位以内"
WHEN rank_ BETWEEN 4 AND 5 THEN "4-5位以内"
WHEN rank_ BETWEEN 6 AND 10 THEN "6-10位以内" END
FROM
(
SELECT
date
,user_id
,ROW_NUMBER() OVER(ORDER BY point DESC) AS rank_
FROM
`user_point.csvの情報を記載したテーブル`
) AS a
ORDER BY
rank_
実行するとこんな結果になります。

日付や月単位で区切りたい場合はpartition byを組み合わせるといいですね。
関連記事:【SQL】分析関数①ROW_NUMBERで集計対象ごとに順番付け

コメント