0
0

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のviewでは期間指定関数が使えない

Posted at

BiqQueryのviewとは

viewはSQLクエリによって定義される仮想テーブル
クエリを記述することで元となるテーブルから必要なデータだけを取り出した
「テーブルのようなもの=ビュー」

viewを使うメリット

作成したクエリ結果をコンソール上で簡単に保存可能
保存したviewはテーブルと同じように扱えるためクエリ労力が減る
データの定義変更する際、テーブルはデータの置き換えが必要だが、viewの定義はもととなるクエリを書き換えるだけで変更可能

※毎日、毎月定期実行するようものをビューとして保存して使うのが一般的

テーブルでは出来てviewでは出来ない期間指定関数

日付を跨いだ期間指定が出来ない
例えばviewが日付ごとに分かれていたとした場合
test-yy.views_000000.events_20230101
test-yy.views_000000.events_20230102
test-yy.views_000000.events_20230103
これら3日間の合計ユーザー数を知りたい場合は

_TABLE_SUFFIX BETWEEN "20230101" AND "20230103"

を指定して集計すれば問題ないが、

viewでは

_TABLE_SUFFIX BETWEEN "YYYYMMDD" AND "YYYYMMDD"

が使用できない

3日間のユーザー数を集計する方法は2通り
・viewをテーブル化する(テーブル作成権限がある場合に限る)
・UNION ALLで3日間分のデータを繋げる

結論

viewデータでしか権限を貰えていない場合は何故テーブルで貰えないかを確認した方が良い
参照権を与えたくないカラムがある為のみであれば(個人情報を閲覧させたくない等)

検討案1:マスク処理したテーブルを新しく作る
マスク処理したテーブルを別途作りマスク済みのカラムを閲覧。
ロードしたテーブルとは別に個人情報ををマスクした値を適用したテーブルを作る。
この方法だとポリシータグと併用はでき、データ基盤でデータレイクの役割は担える一方で、テーブルの実体が増えるので管理が煩雑に。

検討案2:元テーブルにマスク済みのカラムを新しく追加する
元のデータは残したままテーブルにマスクしたカラムを追加する案です。元データは残し、カラムレベルのアクセス制御を行った状態のまま利用者にマスクしたカラムを閲覧。

どうしてもviewでしか参照権を貰えない

スケジュールクエリ等でviewをテーブル化することが賢明

DECLARE yesterday INT64;
SET yesterday = (SELECT CAST(FORMAT_DATE("%Y%m%d",CURRENT_DATE() -1) as INT64));

EXECUTE IMMEDIATE format("""

  CREATE OR REPLACE TABLE
    `myproject_name.mydataset_name.copy_from_view_%d` AS (

    SELECT
      *
    FROM
      `tenzin_project_name.tenzin_dataset_name.events_%d`
    )

""", yesterday,yesterday);
0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?