一時テーブルと永続的テーブルを使うと、クエリを整理して理解しやすいように管理できます。再利用できる中間結果を作成することで、一時データを集計しない選択肢も保持しながら、より高いパフォーマンスでクエリを実行するために必要なリソースを減らすことができます。
作成されたテーブルは、Ads Data Hub 全域で適用されているものと同じ静的なプライバシー チェック、使用できる関数、フィールド結合の制限が適用されます。最後の SELECT ステートメントが BigQuery に出力されると、標準のプライバシー チェックが適用されます。
テーブルを作成するには、BigQuery の構文に従います。
CREATE [OR REPLACE] [TEMP | TEMPORARY] TABLE TABLE_NAME
[OPTIONS(privacy_checked_export=<true | false>)] AS query_statement;
以下の句はサポートされません。
IF NOT EXISTSPARTITION BYCLUSTER BY
一時テーブル
一時テーブルを使うと、クエリの可読性が向上するとともに、集計されていないデータを含む中間結果を作成できます。
一時テーブルには以下のような性質があります。
- セッション単位でのみ存在し、クエリ実行後は期限切れとなります
- 当該テーブルが作成されたクエリ内でのみ使用できます
- プライバシー チェックがまだ適用されていない集計されていないデータを保存する場合があります
- 必要な名前空間なしで名前で参照される
一時テーブルを作成するには、CREATE TEMP TABLE ステートメントを使用します。この例では、クエリの結果を保存する一時テーブルを作成し、サブクエリでその一時テーブルを使用します。
-- Get a list of creative IDs and store in a temporary table called creative_list:
CREATE TEMP TABLE creative_list AS (
SELECT
adgroup_id,
advertiser_id,
creative_id
FROM
adh.dv360_youtube_impressions
);
-- Return creatives with a count of impressions greater than 100
SELECT
creative_id,
COUNT(*) AS imps
FROM
creative_list
WHERE
imps > 100
GROUP BY
creative_id;
永続的テーブル
他のクエリで使用する中間テーブルを作成する必要がある場合は、永続的テーブルを作成できます。構文は、TEMP 句がない点を除いて、一時テーブルの場合と同じです。これらのテーブルは 72 時間持続します。選択した名前のテーブルがすでに存在している場合は上書きされます。
永続テーブルには集計されていないデータが保存されることがありますが、プライバシー チェック済みのクエリ結果以外ではテーブルの内容は表示されません。
永続的テーブルには以下のような性質があります。
- 72 時間後に期限切れとなります
- 当該テーブルが作成されたクエリの外部でも使用できます
- プライバシー チェックがまだ適用されていない集計されていないデータを保存する場合があります
tmp名前空間で参照されますが、同じクエリ内の名前で参照することもできます。
永続テーブルを作成するには、CREATE TABLE ステートメントを使用します。この例では、クエリの結果を保存する永続テーブルを作成し、後に作成されたクエリでその永続テーブルを使用します。
クエリ 1
-- Get a list of creative IDs and store in a persistent table called creative_list:
CREATE TABLE creative_list AS (
SELECT
adgroup_id,
advertiser_id,
creative_id
FROM
adh.dv360_youtube_impressions
);
-- Return the total count of impressions in the table
SELECT
COUNT(*) AS imps
FROM
tmp.creative_list -- Alternative: creative_list
クエリ 2
-- Return creatives which had more than 100 impressions
SELECT
creative_id,
COUNT(*) AS imps
FROM
tmp.creative_list
WHERE
imps > 100
GROUP BY
creative_id;
プライバシー チェックを適用する
Ads Data Hub は、クエリ結果の出力先として中間結果テーブル(プライバシー チェックの対象)を作成する SQL 構文にも対応しています。
プライバシー チェックの対象になるテーブルを作成するには、クエリに OPTIONS 句を追加します。
OPTIONS(privacy_checked_export=true)
この例では、セッション単位の一時テーブルを作成し、プライバシー チェックを適用します。
-- Get a list of creative IDs and store in a temporary table called creative_list:
CREATE TEMP TABLE creative_list OPTIONS(privacy_checked_export=true) AS (
SELECT
adgroup_id,
advertiser_id,
creative_id
FROM
adh.dv360_youtube_impressions
);
この例では、永続テーブルを作成し、プライバシー チェックを適用して、Google Cloud プロジェクトにエクスポートします。
-- Get a list of creative IDs and store in a persistent table called creative_list:
CREATE TABLE project_name.dataset_name.creative_list` OPTIONS(privacy_checked_export=true) AS (
SELECT
adgroup_id,
advertiser_id,
creative_id
FROM
adh.dv360_youtube_impressions
);
単一のクエリによる複数のテーブルのエクスポート
クエリごとに 1 つのテーブルでは不十分な場合でも、Ads Data Hub では、柔軟な SQL 構文を活かして、表示可能な結果のテーブルをエクスポートすることができます。これらのテーブルには、Ads Data Hub に適用されるものと同じプライバシー チェックが行われます。
メインの SQL 式とともにテーブルをエクスポートする構文は次のとおりです。
CREATE TABLE PROJECT_NAME.DATASET.TABLE_NAME
OPTIONS(privacy_checked_export=true) AS query_statement;
たとえば、BigQuery の宛先 PROJECT_NAME.DATASET.TABLE_NAME に、テーブル adh.google_ads_impressions の各キャンペーン ID の行数を含むテーブルをエクスポートする場合は、次のようになります。
CREATE TABLE PROJECT_NAME.DATASET.TABLE_NAME
OPTIONS(privacy_checked_export=true) AS
SELECT campaign_id, COUNT(*) AS ct
FROM adh.google_ads_impressions
GROUP BY campaign_id;
次の例では、このアイデアを拡張し、同じクエリを使用して 2 つのテーブルを BigQuery にエクスポートします。
CREATE TABLE PROJECT_NAME.DATASET.TABLE_NAME
OPTIONS(privacy_checked_export=true) AS
SELECT campaign_id, COUNT(*) AS ct
FROM adh.google_ads_impressions
GROUP BY campaign_id;
CREATE TABLE PROJECT_NAME.DATASET.TABLE_NAME_2
OPTIONS(privacy_checked_export=true) AS
SELECT advertiser_id, COUNT(*) AS ct
FROM adh.google_ads_impressions
GROUP BY advertiser_id;
テーブルは、作成時と同じクエリで参照することもできます。たとえば、次のクエリは 2 つのテーブルを出力します。
CREATE TABLE PROJECT_NAME.DATASET.TABLE_NAME
OPTIONS(privacy_checked_export=true) AS
SELECT campaign_id, COUNT(*) AS ct
FROM adh.google_ads_impressions
GROUP BY campaign_id;
SELECT ct FROM PROJECT_NAME.DATASET.TABLE_NAME;
- 最初のテーブルは
PROJECT_NAME.DATASET.TABLE_NAMEに作成され、campaign_id列とct列を含みます。 - 2 つ目のテーブルは、ジョブ引数の宛先テーブルのフィールドで指定されたロケーションに作成され、
ct列を含みます。
フィルタされた行の概要を追加する
これらのテーブルに、フィルタされた行の概要を追加することもできます。フィルタされた行の概要を読む。
実行時に複数のテーブルに名前を付ける
クエリで複数のテーブルを作成する場合、テーブルに名前を付ける方法は 2 つあります。
- 次の形式(
PROJECT_NAME.DATASET.TABLE_NAME)を使用して、SQL でテーブルを明示的に指定します。 - SQL でパラメータをプレースホルダとして使用し、実行時にテーブルに名前を付けます。