##概要
BigQueryで、カラムに順番をつける関数を紹介します。
・RANK関数
・DENSE_RANK関数
・ROW_NUMBER関数
##使用テーブル: item_table
user_id | item | price |
---|---|---|
A | みかん | 50 |
A | りんご | 100 |
B | りんご | 100 |
A | もやし | 19 |
B | りんご | 90 |
##研修1:RANK関数 値段の高い順に、列にランキングを追加する
price欄の値で高い順から順番に数字を振ります。
SELECT
user_id,
item,
price,
RANK() OVER (ORDER BY price DESC) AS rank_p
FROM
test1.item_table;
rank_pの列が追加されました。
一番priceが高い1行目、2行目のりんごが’1位’となり、降順でランキングができました。RANK() OVER (ORDER BY price DESC)
という構文のorder by以降にランキングをつけるカラム名を入れ、 DESC を加えることで降順(値が大きいものから低いもの)でランクが割り振られました。
DESCを記載しなければ、昇順でランクが振られます。
#研修2:DENSE_RANK関数 値段の高い順に、列に’重複しない’ランキングを追加する
研修1では、最も高いpriceが2つあったため、ランクのカラムに2つ’1’が立ち、’2’がなく、’3’が立ちました。
今度は重複した値があってもランクの数字を飛ばさないでランキングします。
SELECT
user_id,
item,
price,
DENSE_RANK() OVER (ORDER BY price DESC) AS rank_p
FROM
test1.item_table;
しっかり1から順番にランクのカウントがされました。
##研修3:ROW_NUMBER関数 上から連番をつける
今度は先ほどまでとは違い、カラムの上から順番に連番付けていきます。行番号を付与するときに使えます。
SELECT
user_id,
item,
price,
ROW_NUMBER() OVER (ORDER BY price DESC)AS rank_p
FROM
test1.item_table;
上記を実行すると、
無事1行目からランクが付加されました。
ちなみに特に何も指定せず、row_number()over()
の列を追加すると。。。
SELECT
user_id,
item,
price,
ROW_NUMBER() OVER ()AS rank_p
FROM
test1.item_table;
ランダムで行を選び、上から連番で番号を振ってくれます。
#まとめ
今回扱った関数、
RANK関数は重複した番号は飛ばして、連番を振ります。
DENSE_RANK関数は重複した番号を飛ばさず、連番を振ります。
ROW_NUMBER関数は行に1つずつ重複のない、連番を振ります。
これら異なった関数を、臨機応変に活用し、使いこなせるようになりたいです💛