创建表

临时表和永久表有助于简化查询,使之更易于理解和维护。通过创建可重复使用的中间结果,并使用可使临时数据保持未汇总状态的选项,您可以减少执行查询所需的资源,从而提高性能。

创建的表均需遵循在整个广告数据中心强制执行的以下限制:静态隐私权检查允许使用的函数字段联接。如果最终 SELECT 语句的数据是输出到 BigQuery,则需进行标准隐私权检查。

如需创建表,请遵循以下 BigQuery 语法:

CREATE [OR REPLACE] [TEMP | TEMPORARY] TABLE TABLE_NAME
 [OPTIONS(privacy_checked_export=<true | false>)] AS query_statement;

以下子句不受支持:

  • IF NOT EXISTS
  • PARTITION BY
  • CLUSTER 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;

执行隐私权检查

广告数据中心还支持使用 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
);

使用单个查询导出多个表

广告数据中心支持使用灵活的 SQL 语法,在每个查询一个表不够用的情况下导出多个可查看的结果表。这些表都需要接受在整个广告数据中心强制执行的那些隐私权检查

在主 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;

以下示例扩展了这一思路,并使用同一查询将两个表导出到 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;

也可以在创建表的同一查询中引用这些表。例如,以下查询会输出两个表:

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_idct 列。
  • 第二个表创建在作业参数的目标表字段中指定的位置,包含 ct 列。

添加被滤除的行摘要

您还可以向这些表中添加“被滤除的行摘要”。了解“被滤除的行摘要”

在运行时命名多个表

在查询中创建多个表时,有两种命名方式:

  • 使用以下格式在 SQL 中明确命名表:PROJECT_NAME.DATASET.TABLE_NAME
  • 在 SQL 中使用参数作为占位符,然后在运行时命名表。

创建和更新 BigQuery 表

广告数据中心支持在脚本中直接使用某些 BigQuery 语句,从而可以将行插入到现有结果表中,而不是为每个作业生成新结果表。这些语句必须引用 BigQuery 项目中的直接表路径,并且无法直接访问广告数据中心表或选项(例如 privacy_checked_export)。

支持的语句:

查询示例:

-- Compute new data for the current job. This table can be used with MERGE.
CREATE TEMP TABLE new_data OPTIONS(privacy_checked_export=TRUE) AS
SELECT
  DATE(event_time, @time_zone) AS event_date,
  <more grouping keys>,
  COUNT(*) AS impressions,
  <more metrics>
FROM ...
GROUP BY ALL;

-- Initialize a result table on the first run of the query, which may include
-- date partitioning and/or clustering for efficiency.
CREATE TABLE IF NOT EXISTS PROJECT_NAME.DATASET.TABLE_NAME (<columns>)
PARTITION BY event_date CLUSTER BY ...
OPTIONS(partition_expiration_days=365);

-- Atomically insert new results or update existing ones.
MERGE PROJECT_NAME.DATASET.TABLE_NAME a
USING new_data b ON a.data_date = b.data_date AND <more grouping keys>
WHEN MATCHED THEN
  UPDATE SET a.impressions = b.impressions, <more metrics>
WHEN NOT MATCHED THEN
  INSERT (<all columns>) VALUES(<all columns>);

请注意,MERGE 语句不支持修改表架构。如果您需要在现有报告表中添加或更改列,可以在广告数据中心内运行作业之前,先在 BigQuery 中更新表架构,也可以运行广告数据中心作业来复制具有更新后的架构和选项的表,例如:

CREATE OR REPLACE TABLE PROJECT_NAME.DATASET.TABLE_NAME
PARTITION BY event_date CLUSTER BY ... OPTIONS(...) AS
SELECT
  <new columns>
FROM PROJECT_NAME.DATASET.TABLE_NAME;