BigQuery の Numbering functions メモ
よく忘れるので調べてメモをする
Numbering functions
分析関数の一部
PARTITION BYで分類した各集合の順序を取得することができる
例:「アクセスログの中から各ユーザーが最初にアクセスした時刻を知りたい」ときとか
テンプレ
1SELECT
2 * EXCEPT(rank)
3FROM (
4 SELECT
5 *,
6 RANK() OVER ( PARTITION BY user_id ORDER BY accessed_at ASC) as rank
7 FROM
8 log
9)
10WHERE rank = 1
解説
大きい構造としては、from 句の中のサブクエリで Numbering function を呼び、順序の情報を持ったテーブルを作ってから取り出したい順番の行だけを where 句で指定している
EXCEPTを指定することで順番に関する情報を消している
OVER句の中では以下を設定する
PARTITION BY:何で分類するか。複数カラムを設定することもできる
ORDER BY:何のカラムをもとにソートするか
RANKは名前の通り順位を返してくれる。そのため、同率のものがあった場合は同じrankになる行ができる。
例:10, 20, 20, 40の値に対して小さい順でソートすることを考えたとき、 1, 2, 2, 4とrank付けしてくれる
DENSE_RANKは同率のものが存在しても順位の増加がかならず1つずつになる。
例:10, 20, 20, 40の値に対して小さい順でソートすることを考えたとき、 1, 2, 2, 3とrank付けしてくれる
PERCENT_RANKはパーセンタイルを出してくれるイメージ。厳密な定義を見るとちょっと感覚が違うかもしれない。あまり使う機会無いかな
CUME_DISTは上位XXパーって感じ
NTILEは引数を一つもつ。分類した結果を引数の数で分割した結果を返してくれる。引数に3を設定したら、上位33%の行には1が、下位33%の行には3が、残りは2が入るイメージ。
ROW_NUMBERは純粋な行番号。同率を区別したいときとか確実に一個の行だけ取得したいときとかは使う