0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【データ基盤構築/BigQuery】QUALIFY句を使用して、重複データのチェックやフィルタリングを行う

Last updated at Posted at 2022-10-26

今回の課題

業務内でETLツールを介して、BigQueryにクエリを実行し、
BigQuery→Google Spread Sheetに「追記」するかたちでデータを転送したところ、
Google Spread Sheetに大量の重複データが格納されている。
という不具合が発生していた。

下記の2つの方法で改善できそうだと分かり、
転送量が少なくて済むため、後者で実装することにした。

改善方法

  • 「追記」ではなく、「全量洗い替え更新」するかたちで転送する。
  • QUALIFY句によるデータ重複チェックをクエリ内に盛り込んだ上で「追記」でデータを転送する。

QUALIFY句とは

クエリで分析関数を使用した場合に分析関数の結果でフィルタリングを行うことができる。

QUALIFY句を使用する際は、
WHERE句、GROUPBY句、HAVING句のいずれかがクエリ内で使用されていなければならない。
※参考:BigQueryのQUALIFY句を使ってみる

実際に使用したクエリ

下記のようにクエリにQUALIFY句を使用して、
BigQuery→Google Spread Sheetsにデータを「追記」転送することにより、
重複するデータを除外して「追記」転送することに成功した。

select
    * -- 省略
from
    `テーブル名`
where -- QUALIFY句を使用するには、WHERE, GROUPBY, HAVINGのどれかを入れておかないといけない。
    1=1
qualify -- 同じpage_title, release_dateの組み合わせのデータの重複を除外(同じpage_title, release_dateの組み合わせのデータは1つしか存在しないというフィルタリング)
    row_number() over(partition by page_title, release_date order by release_date desc) = 1

以上で、今回の課題を解決することができた。

おまけ

QUALIFY句を使用して、実際に重複している行を確認することもできる。
データが多すぎる時や、重複しているような気がしたときに下記クエリを試してみると役に立つかも。

select
    * -- 省略
from
    `テーブル名`
where -- QUALIFY句を使用するには、WHERE, GROUPBY, HAVINGのどれかを入れておかないといけない。
    1=1
qualify -- 同じpage_title, release_dateの組み合わせのデータの重複を除外(同じpage_title, release_dateの組み合わせのデータは1つしか存在しないというフィルタリング)
    row_number() over(partition by <ユニークキー相当> order by <時系列系/順序系カラム> desc) > 1
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?