比對使用者提供的資料

「比對使用者提供的資料」功能會彙整您收集的使用者第一方資料 (例如來自網站、應用程式或實體商店的資訊),以及該使用者在所有 Google 廣告資料 (包括 Google 擁有和營運的資料) 中的登入活動記錄。這包括透過 Google Marketing Platform (GMP) 產品購買的資料,例如使用 Display & Video 360 購買的 YouTube 廣告空間。不支援其他非 Google 擁有和營運的 GMP 產品。

廣告事件必須連結到 Google 廣告資料中的登入使用者,才能比對使用者提供的資料。

本文將說明「比對使用者提供的資料」功能,並提供設定和使用指南。

私有雲比對總覽

如要取得有價值的廣告洞察資料,通常需要整合多個來源的資料。如要自行建構解決方案來處理這項資料管道問題,需要投入大量時間和工程資源。廣告資料中心內的 Private Cloud Match 提供廣告資料中心查詢範本,可在 BigQuery 建立比對表格,並用於廣告資料中心查詢,比對廣告資料和第一方資料,簡化上述程序。使用第一方資料讓查詢內容更豐富,不僅可帶來更豐富的客戶體驗,也更能因應整個產業的廣告追蹤變化。

「比對使用者提供的資料」功能只會比對 Google 自有自營廣告空間的登入使用者,因此不會受到第三方 Cookie 淘汰的影響。比第三方資料更能適應業界變遷,因此可提供更豐富的洞察資料,進而提高顧客參與度。

程序摘要

  1. 設定資料擷取和比對
    • 您:確認第一方資料位於 BigQuery,且服務帳戶具備讀取權限。請參閱「設定資料擷取」。
  2. 第一方資料擷取和比對
    • 您設定第一方資料的格式,並上傳至 BigQuery 資料集。
    • 您可以建立私有雲 Match 分析查詢 並設定排程,啟動資料比對要求。
    • Google 會彙整您專案中的資料和 Google 自有資料 (包含 Google 的使用者 ID 和經雜湊處理的使用者提供資料),建立及更新比對表。
    • 請參閱「擷取第一方資料」
  3. 在廣告資料中心根據比對資料持續查詢
    • 您可以對對照表執行查詢,方法與在廣告資料中心執行一般查詢相同。請參閱「查詢比對資料」。

瞭解隱私權規定

收集顧客數位資料

使用「比對使用者提供的資料」功能時,您必須上傳第一方資料。這可能是您從網站、應用程式、實體商店收集的資訊,或顧客直接提供給您的任何資訊。

須遵循的規定如下:

  • 確實在隱私權政策中聲明您會與第三方共用客戶資料,以便第三方代為提供服務,且您按照法律要求向使用者徵求共用資訊的同意聲明
  • 僅使用 Google 核准的 API 或介面上傳顧客數位資料
  • 遵守所有適用法律和法規,包括任何適用的自我規範或業界準則

確認已取得第一方同意聲明

為確保能在廣告資料中心使用第一方資料,請務必確認您已根據歐盟地區使用者同意授權政策和廣告資料中心政策,取得適當的同意聲明,能與 Google 分享歐洲經濟區使用者的資料。這項規定適用於每個廣告資料中心帳戶,且您每次上傳新的第一方資料時,都必須更新同意聲明。任一使用者都可代表整個帳戶確認已取得同意聲明。

請注意,適用於分析查詢的 Google 服務查詢規則,同樣也適用於 UPDM 查詢。例如,建立對照表時,您無法對歐洲經濟區使用者執行跨服務查詢。

請參閱歐洲經濟區同意聲明規定,瞭解如何在廣告資料中心確認已取得同意聲明。

資料大小

為保護使用者隱私,比對使用者提供的資料功能會強制執行下列資料大小規定:

  • 使用者名單中至少須上傳 1,000 筆記錄。

設定資料擷取

開始前,請確認下列事項:

  • 第一方資料必須位於 BigQuery。如果您有 VPC-SC 範圍,這項第一方資料必須位於 VPC-SC 內。
  • 廣告資料中心服務帳戶必須具備第一方資料的讀取權限。
  • 第一方資料必須正確設定格式並經過雜湊處理。詳情請參閱下一節。

除此之外,私有雲比對功能不需要額外的新手上路流程。只要能執行分析查詢,就能執行 Private Cloud Match 查詢。

擷取及比對第一方資料

來源權限和連線需求

廣告資料中心連結會使用「設定」>「詳細資料」>「服務帳戶」下方顯示的服務帳戶 (通常是 service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com)。請授予下列角色:

  • BigQuery 來源:來源資料集或資料表的 roles/bigquery.dataViewer (BigQuery 資料檢視者)。
  • Cloud Storage 來源:來源 bucket 或物件的 roles/storage.objectViewer (Storage 物件檢視者)。
  • 第一方資料匯入目的地: roles/bigquery.dataEditor (BigQuery 資料編輯者),如果資料表不在預設資料集中。

欄位和資料類型規定

  1. 比對使用者提供的資料 (UPDM):
    • 對應 user_id 和至少一個 PII 欄位 (email、phone 或完整地址:first_name、last_name、country、zip_code)。
    • user_id、country 和 zip_code:純文字 STRING (未經雜湊處理)。如果是 BigQuery 來源,這些資料欄必須已是 STRING;其他類型 (例如 INT64) 在建立連線時會失敗。Connections 會將比對表格中的 user_id 轉換為 BYTES。country 必須是 2 個字母的 ISO 3166-1 alpha-2 代碼。
    • email、phone、first_name 和 last_name:HASH - 必須已使用 SHA-256 雜湊和 Base64 編碼 (也接受 64 個字元的十六進位 SHA-256 值)。Connections 不會對資料進行雜湊處理。建立連線時,系統不會擷取純文字值,因此每次執行都會失敗,並顯示 ... must be encoded using TO_BASE64(SHA256(...))。
    • 「比對使用者提供的資料」連結沒有目的地資料表。帳戶中的所有查詢,以及手動執行的 UPDM 查詢,都會寫入相同的比對資料,因此每次執行都會取代前一次的資料。每個帳戶只需一個 UPDM 連線。
    • 如要瞭解各欄位的規則,請參閱「設定輸入資料的格式」。
  2. 第一方資料匯入:
    • 請僅使用使用者介面提供的資料類型:INTEGER、STRING、HASH、DOUBLE、DATE 和 TIMESTAMP。不支援其他 BigQuery 類型。
    • BigQuery 來源:不套用對應類型,每個目的地資料欄都會保留來源資料欄的類型。
    • Cloud Storage 來源:資料欄會讀取為 STRING,並轉換為對應的類型。無法轉換的值會變成 NULL,不會導致執行失敗。
    • 每次執行都會取代整個目的地資料表,而非附加資料。如果來源沒有任何資料列,目的地就會變成空白。請勿將來源資料表或需要保留資料的資料表設為目的地。

Cloud Storage CSV 資料欄規定

  • 加入標頭列。系統會略過第一行,不使用其中的資料欄名稱。
  • 檔案必須包含對應的來源資料欄,不多也不少。多餘的資料欄會導致執行失敗。
  • 第一方資料匯入:資料欄順序必須與欄位對應順序相同。
  • 比對使用者提供的資料:欄必須依此順序排列,且只保留您對應的欄位:user_id、email、phone、first_name、last_name、country、zip_code。對應列的順序不會造成任何影響。
  • 系統未偵測到不同的資料欄順序:值會載入錯誤的欄位 (或媒合率下降),但不會顯示錯誤。

支援的資料來源和連線限制

  • 資料來源:僅支援 BigQuery 和 Cloud Storage 來源。
  • BigQuery 資料表名稱:來源和目的地 BigQuery 資料表需要完整的 project.dataset.table 名稱。
  • Cloud Storage 檔案路徑:提供單一檔案 URI (例如 gs://bucket/path/file.csv)。不支援含有 * 或 ? 的萬用字元路徑。
  • 連結名稱:帳戶中的每個連結都必須有不重複的名稱。

設定輸入資料的格式

資料必須符合下列格式規定,才能正確比對:

  • 如果下列輸入欄位說明中有所指示,您必須使用 SHA256 雜湊上傳。
  • UPDM 支援 Base64 編碼。請參閱 TO_BASE64。
  • 輸入欄位必須採用字串格式。舉例來說,如果您使用 BigQuery SHA256 雜湊函式,請使用下列轉換:TO_BASE64(SHA256(user_data))。

使用者 ID

  • 資料類型:BYTES
  • 雜湊:無

電子郵件

  • 移除開頭和結尾的空白字元
  • 全部使用小寫字元
  • 為所有電子郵件地址加上網域名稱 (例如 gmail.com 或 hotmail.co.jp)
  • 移除重音符號,例如將 è、é、ê 或 ë 變更為 e
  • 移除 gmail.com 和 googlemail.com 電子郵件地址中,網域名稱前所有的半形句號 (.)
  • 雜湊:Base64 編碼 SHA256

有效期限: TO_BASE64(SHA256("jeffersonloveshiking@gmail.com"))

無效: TO_BASE64(SHA256("JéffersonLôvesHiking@gmail.com"))

電話

  • 移除空白字元
  • 請採用 E.164 格式,例如:+14155552671 (美國)、+442071838750 (英國)
  • 移除所有特殊字元,但國家/地區代碼前的「+」除外
  • 雜湊:Base64 編碼 SHA256

有效期限: TO_BASE64(SHA256("+18005550101"))

無效: TO_BASE64(SHA256("(800) 555-0101"))

名字

  • 移除空白字元
  • 全部使用小寫字元
  • 移除所有前置詞,例如 Mrs.、先生、Ms., 博士
  • 請勿移除重音符號,例如 è、é、ê 或 ë
  • 雜湊:Base64 編碼 SHA256

有效期限: TO_BASE64(SHA256("daní"))

無效: TO_BASE64(SHA256("Daní"))

姓氏

  • 移除空白字元
  • 全部使用小寫字元
  • 移除所有後置詞,例如 Jr.、Sr., 2nd、3rd、II、III、PHD、MD
  • 請勿移除重音符號,例如 è、é、ê 或 ë
  • 雜湊:Base64 編碼 SHA256

有效期限: TO_BASE64(SHA256("délacruz"))

無效: TO_BASE64(SHA256("dé la Cruz, Jr."))

國家/地區

  • 即使所有顧客數位資料的國家/地區代碼皆相同,仍須納入
  • 請勿雜湊處理國家/地區資料
  • 使用 ISO 3166-1 alpha-2 國家/地區代碼
  • 雜湊:無

有效期限: US

無效: United States of America 或 USA

郵遞區號

  • 請勿雜湊處理郵遞區號資料
  • 美國與國際郵遞區號皆可使用
  • 美國:
    • 可使用 5 碼郵遞區號,例如 94043
    • 也可使用 5 碼後加 4 碼額外編碼的郵遞區號,例如 94043-1351 或 940431351
  • 所有其他國家/地區:
    • 不需設定格式 (不需轉換為小寫,或移除空格和特殊字元)
    • 移除郵遞區號的額外編碼
  • 雜湊:無

雜湊驗證和資料編碼

您可以使用下列雜湊驗證指令碼,確保資料格式正確。

JavaScript

  /**
   * @fileoverview Provides the hashing algorithm, as well as some valid hashes of
   * sample data for testing.
  */

  async function hash(token) {
    // Removes leading or trailing spaces and converts all characters to lowercase.
    const formattedToken = token.trim().toLowerCase();
    // Hashes the formatted string using the SHA-256 hashing algorithm.
    const hashBuffer = await crypto.subtle.digest(
        'SHA-256', (new TextEncoder()).encode(formattedToken));
    // Converts the hash buffer to a base64-encoded string and returns it.
    const base64Str = btoa(String.fromCharCode(...new Uint8Array(hashBuffer)));
    return base64Str;
  }

  function main() {
    // Expected hash for test@gmail.com:
    // h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    hash('test@gmail.com').then(result => console.log(result));

    // Expected hash for +18005551212:
    // YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    hash('+18005551212').then(result => console.log(result));

    // Expected hash for John: ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    hash('John').then(result => console.log(result));

    // Expected hash for Doe: eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
    hash('Doe').then(result => console.log(result));
  }

  main()

Python

  """Provides the hashing algorithm, as well as some valid hashes of sample data for testing.

  Supports: Python 2, Python 3

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  """

  import base64
  import hashlib

  def hash(token):
  # Generates a base64-encoded SHA-256 hash of a normalized input string.
    return base64.b64encode(
        hashlib.sha256(
            token.strip().lower().encode('utf-8')).digest()).decode('utf-8')

  def print_hash(token, expected=None):
  # Computes and displays the hash of a token, with optional validation.
    hashed = hash(token)

    if expected is not None and hashed != expected:
      print(
          'ERROR: Incorrect hash for token "{}". Expected "{}", got "{}"'.format(
              token, expected, hashed))
      return

    print('Hash: "{}"\t(Token: {})'.format(hashed, token))

  def main():
  # Tests the hash function with sample tokens and expected results.
    print_hash(
        'test@gmail.com', expected='h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=')
    print_hash(
        '+18005551212', expected='YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=')
    print_hash('John', expected='ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=')
    print_hash('Doe', expected='eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=')

  if __name__ == '__main__':
    main()

Go

  /*
  Provides the hashing algorithm, as well as some valid hashes of sample data for testing.

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  */
  package main

  import (
    "crypto/sha256"
    "encoding/base64"
    "fmt"
    "strings"
  )

  // Hash hashes an email, phone, first name, or last name into the correct format.
  func Hash(token string) string {
    formatted := strings.TrimSpace(strings.ToLower(token))
    hashed := sha256.Sum256([]byte(formatted))
    encoded := base64.StdEncoding.EncodeToString(hashed[:])
    return encoded
  }

  // PrintHash prints the hash for a token.
  func PrintHash(token string) {
    fmt.Printf("Hash: \"%s\"\t(Token: %s)\n", Hash(token), token)

  }

  func main() {
    PrintHash("test@gmail.com")
    PrintHash("+18005551212")
    PrintHash("John")
    PrintHash("Doe")
  }

Java

  package updm.hashing;

  import static java.nio.charset.StandardCharsets.UTF_8;

  import java.security.MessageDigest;
  import java.security.NoSuchAlgorithmException;
  import java.util.Base64;

  /**
  * Example of the hashing algorithm.
  *
  * <p>Sample hashes:
  *
  * <ul>
  *   <li>Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
  *   <li>Phone '+18005551212': YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
  *   <li>First name 'John': ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
  *   <li>Last name 'Doe': eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  * </ul>
  */
  public final class HashExample {

  private HashExample() {}

  public static String hash(String token) {
    // Normalizes and hashes the input token using SHA-256 and Base64 encoding.
    String formattedToken = token.toLowerCase().strip();

    byte[] hash;
    try {
      hash = MessageDigest.getInstance("SHA-256").digest(formattedToken.getBytes(UTF_8));
    } catch (NoSuchAlgorithmException e) {
      throw new IllegalStateException("SHA-256 not supported", e);
    }

    return Base64.getEncoder().encodeToString(hash);
  }

  public static void printHash(String token) {
    // Calculates and prints the hash for the given token.
    System.out.printf("Hash: \"%s\"\t(Token: %s)\n", hash(token), token);
  }

  public static void main(String[] args) {
    // Executes hash calculations and prints results for sample tokens.
    printHash("test@gmail.com");
    printHash("+18005551212");
    printHash("John");
    printHash("Doe");
  }
  }

SQL

  /*
  Provides the hashing algorithm, as well as some valid hashes of sample data for testing.

  The following code uses Google Standard SQL and can be run on BigQuery to generate match tables from unhashed data.

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=

  The unhashed input table schema is assumed to be:

  - Column name: UserID, Type: String
  - Column name: Email, Type: String
  - Column name: Phone, Type: String
  - Column name: FirstName, Type: String
  - Column name: LastName, Type: String
  - Column name: PostalCode, Type: String
  - Column name: CountryCode, Type: String
  */

  -- Creates a new table with Base64-encoded SHA-256 hashes of specified columns.
  CREATE TABLE `your_project_name.your_dataset_name.output_hashed_table_name`
  AS
  SELECT
    UserID,
    TO_BASE64(SHA256(LOWER(Email))) AS Email,
    TO_BASE64(SHA256(Phone)) AS Phone,
    TO_BASE64(SHA256(LOWER(FirstName))) AS FirstName,
    TO_BASE64(SHA256(LOWER(LastName))) AS LastName,
    PostalCode,
    CountryCode,
  FROM
    `your_project_name.your_dataset_name.input_unhashed_table_name`;

加入鍵值

某些使用者提供資料的組合比其他組合更有效。以下列出不同的使用者提供資料組合,並依相對強度排序。如果使用地址,則必須包含:名字、姓氏、國家/地區和郵遞區號。

  1. 電子郵件、電話、地址 (最強)
  2. 電話、地址
  3. 電子郵件、地址
  4. 電子郵件、電話
  5. 地址
  6. 電話
  7. 電子郵件 (最弱)

建立比對表格

  1. 依序點選 「add 建立」>「 報表」。
  2. 選取「私有雲對照表產生」範本。選用:如果資料尚未經過雜湊處理,可以選取「Private cloud match table generation (with hashing)」(生成私有雲比對表 (進行雜湊處理))。
  3. 按一下「Edit query」(編輯查詢),然後將參數名稱替換為資料欄名稱,提供適當的別名。
  4. 按一下「設定排程」,設定對應表的重新整理頻率。每次執行都會覆寫目前的對照表。

遷移現有連結

「連結」分頁中的現有連結,將移至直接內建於廣告資料中心的新版「連結」頁面。更新後的連結會使用「設定」>「詳細資料」>「服務帳戶」下方顯示的服務帳戶 (通常是 service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com),讀取來源和寫入目的地,而非舊版 Data Fusion、Dataproc 和 UPDM 服務帳戶。

請在連結移動之前完成下列待辦事項:

  1. 授予服務帳戶權限:依序前往「設定」>「詳細資料」>「服務帳戶」,將必要的來源和目的地角色 (roles/bigquery.dataViewer、roles/storage.objectViewer 和非預設目的地資料集的 roles/bigquery.dataEditor) 授予其中顯示的服務帳戶 (通常是 service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com)。如果連結的來源無法讀取、已刪除或變更,仍可移動 (尤其是 Cloud Storage 來源,在移動時不會驗證),但執行作業會失敗,直到您授予存取權或修正來源為止。
  2. 轉換不支援的連線:系統不會遷移採用下列設定的連線。請轉換為支援的 BigQuery 或 Cloud Storage 連線:
    • 其他資料來源 (Amazon S3、Snowflake、MySQL、PostgreSQL、Amazon Redshift、sFTP 或 Salesforce):先將資料暫存在 BigQuery 或 Cloud Storage,然後建立 BigQuery 或 Cloud Storage 連線。
    • 不支援的欄位對應或資料類型:更新或重新建立連結,以符合欄位和資料類型規定。
    • Cloud Storage 萬用字元路徑 (* 或 ?):請將萬用字元 URI 替換為單一檔案 URI,或先將檔案載入 BigQuery。
    • 連線名稱重複:重新命名或刪除重複的連線,確保帳戶中的每個連線都有不重複的名稱。
  3. 刪除未使用的連線:刪除不再需要的過時連線。

查詢比對資料

查詢對照表

如果對照表包含足夠的資料,可以滿足隱私權檢查的條件,您就能針對資料表執行查詢。

第一方資料 (1PD) 的原始資料表以 my_data 表示。包括個人識別資訊 (PII) 和非 PII 資料。 與比對表相比,原始資料表代表範圍內的所有第一方資料,因此使用原始資料表可提供更多洞察資料,改善報表品質。

廣告資料中心結構定義中,每個包含 user_id 欄位的資料表,都會附帶一個對照表。以 adh.google_ads_impressions 資料表為例,廣告資料中心會產生名為 adh.google_ads_impressions_updm 的對照表,其中包含 User-ID。如果是政策排除聯播網資料表,系統會建立個別的對照表。以 adh.google_ads_impressions_policy_isolated_network 資料表為例,廣告資料中心會產生名為 adh.google_ads_impressions_policy_isolated_network_updm 的對照表,其中包含 User-ID。

這些資料表包含原始資料表的一部分使用者,user_id 會有相符項目。舉例來說,如果原始資料表包含使用者 A 和使用者 B 的資料,但只有使用者 A 成功比對,那麼使用者 B 就不會出現在對照表。

對照表包含另一個名為 customer_data_user_id 的資料欄,該欄會以位元組形式儲存使用者 ID。

編寫查詢時,請務必考慮欄位的類型。SQL 比較運算子會認為您要比較的常值類型相同。視第一方資料表儲存 user_id 的方式而定,您可能需要先為資料表中的值編碼,才能比對資料。您必須將彙整鍵轉換為位元組,才能成功比對:

JOIN ON
  adh.google_ads_impressions_updm.customer_data_user_id = CAST(my_data.user_id AS BYTES)

另外,在 SQL 中比較字串時會區分大小寫,因此您可能需要為比較兩方的字串編碼來提高比較準確度。

查詢範例

計算相符使用者數

這項查詢會計算 Google Ads 曝光表格中比對成功的使用者人數。

/* Count matched users in Google Ads impressions table */

SELECT COUNT(DISTINCT user_id)
FROM adh.google_ads_impressions_updm

計算媒合率

並非所有使用者都符合配對資格。舉例來說,UPDM 不會比對登出使用者、兒童和未同意使用者。您可以使用 is_updm_eligible 欄位,更準確地計算 UPDM 媒合率。請注意,is_updm_eligible 欄位自 2024 年 10 月 1 日起提供。您無法使用這個欄位計算該日期之前的媒合率。

/* Calculate the UPDM match rate */

CREATE TEMP TABLE total_events OPTIONS(privacy_checked_export=TRUE) AS
SELECT
  customer_id,
  COUNT(*) AS n
FROM adh.google_ads_impressions
WHERE is_updm_eligible
GROUP BY 1;

CREATE TEMP TABLE matched_events OPTIONS(privacy_checked_export=TRUE) AS
SELECT
  customer_id,
  COUNT(*) AS n
FROM adh.google_ads_impressions_updm
GROUP BY 1;

SELECT
  customer_id,
  SAFE_DIVIDE(matched_events.n, total_events.n) AS match_rate
FROM total_events
LEFT JOIN matched_events
  USING (customer_id)

彙整第一方和 Google Ads 廣告資料

這項查詢會顯示如何彙整第一方資料與 Google Ads 廣告資料:

/* Join first-party data with Google Ads data. The customer_data_user_id field
contains your ID as BYTES. You need to cast your join key into BYTES for
successful matches. */

SELECT
  inventory_type,
  COUNT(*) AS impressions
FROM
  adh.yt_reserve_impressions_updm AS google_data_imp
LEFT JOIN
  `my_data`
ON
  google_data_imp.customer_data_user_id = CAST(my_data.user_id AS BYTES)
GROUP BY
  inventory_type

UPDM 常見問題

如需 UPDM 相關常見問題清單,請參閱「UPDM 常見問題」。