🐵

BigQuery : qualify句を簡単な具体例で理解する

2024/02/26に公開

qualify句の目的

ネストを減らしてクエリをシンプルなもの

なぜシンプルにできるか

ウィンドウ関数を使った結果に対して、条件を指定することで絞り込みができるから

テストデータ

以下のような試験データが入ったテーブルがあったとする
カラムには(試験を受けた)日、(試験を受けた人の)名前、点数がある

day name score
2024/01/01 A 80
2024/01/01 B 75
2024/01/01 C 50
2024/01/01 D 89
2024/02/01 A 70
2024/02/01 B 30
2024/02/01 C 40
2024/03/01 D 70
2024/03/01 A 66
2024/03/01 B 93
2024/03/01 C 88
2024/03/01 D 58

テストデータから何をするか

このデータから日別の最高得点者のレコードを抽出する

Qualify句を使わないパターン

with score_rank as(
select
  *,
  rank() over(partition by day order by score desc) as high_score_ranking
from
  Test
)
select *
from score_rank
where high_score_ranking = 1
;

score_rankというwith句の中で、日毎のランキングを作成した
score_rankの時点では以下の状態

day name score high_score_ranking
2024/01/01 D 89 1
2024/01/01 A 80 2
2024/01/01 B 75 3
2024/01/01 C 50 4
2024/02/01 A 70 1
2024/02/01 C 40 2
2024/02/01 B 30 3
2024/03/01 B 93 1
2024/03/01 C 88 2
2024/03/01 D 70 3
2024/03/01 A 66 4
2024/03/01 D 58 5

そこからhigh_score_rankingが1のレコードのみ抽出した
最終的なクエリ結果はこちら

day name score high_score_ranking
2024/01/01 D 89 1
2024/02/01 A 70 1
2024/03/01 B 93 1

Qualify句を使ったパターン

select
  *,
  rank() over(partition by day order by score desc) as high_score_ranking
from
  Test
  qualify high_score_ranking = 1
;

score_rankというwith句を作らなくても、日毎の最高得点者のみを表示できた

まとめ

ウィンドウ関数を使った結果に対して、条件を指定することで絞り込みができるqualify句は、
ネストを減らしてクエリをシンプルなものとする

Discussion