セグメンテーション

分割は Google 広告の管理画面で個別のメニューとして利用できますが、適切なフィールドをクエリに追加するだけで、Google Ads API で実装できます。たとえば、クエリに segments.device を追加すると、FROM内のデバイスと指定したリソースの組み合わせごとに行が含まれ、統計情報(インプレッション数、クリック数、コンバージョン数など)がそれらの間で分割されたレポートが作成されます。

Google 広告の管理画面では一度に 1 つのセグメントしか使用できませんが、API では同じクエリで複数のセグメントを指定できます。

SELECT
  campaign.name,
  campaign.status,
  segments.device,
  metrics.impressions
FROM campaign

このクエリを GoogleAdsService.SearchStream に送信した結果は、次の JSON 文字列のようになります。

{
  "results":[
    {
      "campaign":{
        "resourceName":"customers/1234567890/campaigns/111111111",
        "name":"Test campaign",
        "status":"ENABLED"
      },
      "metrics":{
        "impressions":"10922"
      },
      "segments":{
        "device":"MOBILE"
      }
    },
    {
      "campaign":{
        "resourceName":"customers/1234567890/campaigns/111111111",
        "name":"Test campaign",
        "status":"ENABLED"
      },
      "metrics":{
        "impressions":"28297"
      },
      "segments":{
        "device":"DESKTOP"
      }
    },
    ...
  ]
}

上記のサンプル結果では、リソース名を含む 1 番目のオブジェクトと 2 番目のオブジェクトの属性は同じです。インプレッションはデバイス別に分割されるため、同じキャンペーンで 2 つ以上のオブジェクトが返される場合があります。

暗黙的セグメント分割

すべてのレポートは、最初に FROM 句で指定されたリソースでセグメント化されます。FROM 句に含まれるリソースの resource_name フィールドが返され、クエリに resource_name フィールドが明示的に含まれていない場合でも、それによって指標がセグメント化されます。たとえば、FROM 句でリソースとして ad_group を指定すると、ad_group.resource_name が自動的に返され、指標は ad_group レベルで暗黙的にセグメント化されます。

このクエリでは、

SELECT metrics.impressions
FROM ad_group

次のような JSON 文字列が得られます。

{
  "results":[
    {
      "adGroup":{
        "resourceName":"customers/1234567890/adGroups/2222222222"
      },
      "metrics":{
        "impressions":"237"
      }
    },
    {
      "adGroup":{
        "resourceName":"customers/1234567890/adGroups/33333333333"
      },
      "metrics":{
        "impressions":"15"
      }
    },
    {
      "adGroup":{
        "resourceName":"customers/1234567890/adGroups/44444444444"
      },
      "metrics":{
        "impressions":"0"
      }
    }
  ]
}

FROM 句で ad_group がリソースとして指定されているため、adGroupresource_name フィールドは常に返されます。

選択可能なセグメント フィールド

FROM 句の特定のリソースに対して、すべてのセグメント フィールドを選択できるわけではありません。ここでは、引き続き ad_group リソースからクエリを実行します。セグメント フィールドを ad_group リソースから選択できるようにするには、そのフィールドが ad_group の Segments リストに存在している必要があります。Segments リストは、ad_group リソースのメタデータ ページにある使用可能なフィールドの表の黄色の部分です。

セグメントに関するリソース

一部のリソースから選択すると、FROM 句でリソースのフィールドとともにそれらのフィールドを選択することで、関連リソースを暗黙的に結合できる場合があります。これらの関連リソースは、FROM 句のメタデータ ページにあるリソースの Attributed Resources リストにあります。ad_group リソースの場合は、campaign リソースからフィールドを選択することもできます。resource_name フィールドがクエリに明示的に含まれていない場合でも、SELECT 句に 1 つ以上のフィールドがある Attributed Resources の resource_name フィールドは自動的に返されます。

Attributed Resource フィールドを選択する場合と同様に、Segmenting Resource フィールドも選択できます。特定のリソースのメタデータ ページに Segmenting Resources リストがある場合、リストされたリソースのいずれかからフィールドを選択すると、その Segmenting Resource の返された resource_name でクエリがさらに分割されます。たとえば、campaign リソースは campaign_budget リソースの Segmenting Resource としてリストされています。campaign_budget リソースからキャンペーン フィールド(campaign.name など)を選択すると、campaign.name フィールドだけでなく、campaign.resource_name フィールドも返され、セグメント化されます。

セグメントと指標の選択性

特定のセグメント フィールドは、他の一部のセグメント フィールドや一部の指標フィールドと互換性がない場合があります。相互に互換性を持つセグメント フィールドを特定するには、SELECT 句のセグメントの selectable_with リストを確認します。

ad_group リソースの場合、選択可能なセグメントが 50 以上あります。ただし、segments.hotel_check_in_dateselectable_with リストは互換性のあるセグメントのはるかに小さいセットです。つまり、segments.hotel_check_in_date フィールドを SELECT 句に追加すると、選択可能なセグメントが、これら 2 つのリストの共通部分に限定されます。

セグメントを追加すると、概要行の指標が低下することがあります
FROM ad_group_ad を指定したクエリに segments.keyword.info.match_type を追加すると、そのセグメントは、キーワードが含まれるデータの行のみを取得し、キーワードに関連付けられていない行を削除するようクエリに指示します。この場合、キーワード以外の指標が除外されるため、指標は低くなります。

WHERE 句のセグメントのルール

セグメントを WHERE 句に含める場合は、SELECT 句にも含める必要があります。このルールの例外となる次の日付セグメントはコア日付セグメントと呼ばれます。

  • segments.date
  • segments.week
  • segments.month
  • segments.quarter
  • segments.year

主要な日付セグメント フィールドのルール

セグメント segments.datesegments.weeksegments.monthsegments.quartersegments.year は次のように機能します。

  • これらのセグメントは、SELECT 句の中で使用せずに WHERE 句でフィルタリングできます。

  • これらのセグメントのいずれかが SELECT 句に含まれている場合は、主要な日付セグメントで構成される有限期間を WHERE 句で指定する必要があります(日付セグメントは SELECT で指定したものと同じである必要はありません)。

無効: segments.dateSELECT 句に含まれているため、segments.datesegments.weeksegments.monthsegments.quarter、または segments.yearWHERE 句で有限期間を指定する必要があります。
SELECT
  campaign.name,
  metrics.clicks,
  segments.date
FROM campaign
有効: このクエリは、期間中に発生したキャンペーン名とクリック数を返します。segments.dateSELECT 句に含める必要はありません。
SELECT
  campaign.name,
  metrics.clicks
FROM campaign
WHERE segments.date > '2020-01-01'
  AND segments.date < '2020-02-01'
有効: このクエリは、期間内のすべての日を対象に、キャンペーン名とクリック数を日付別に分割して返します。
SELECT
  campaign.name,
  metrics.clicks,
  segments.date
FROM campaign
WHERE segments.date > '2020-01-01'
  AND segments.date < '2020-02-01'
有効: このクエリは、期間内のすべての日について、キャンペーン名とクリック数を月別に返します。
SELECT
  campaign.name,
  metrics.clicks,
  segments.month
FROM campaign
WHERE segments.date > '2020-01-01'
  AND segments.date < '2020-02-01'
有効: このクエリは、キャンペーン名とクリック数を四半期別、次に年範囲内のすべての月別に月別に分割して返します。
SELECT
  campaign.name,
  metrics.clicks,
  segments.quarter,
  segments.month
FROM campaign
WHERE segments.year > 2015
  AND segments.year < 2020

search_term_view

なお、search_term_view リソースの場合、リソース名の構造にも反映されているように、検索キーワードだけでなく広告グループでも暗黙的にセグメント化されます。リソース名には広告グループも含まれます。そのため、実際には行が別の広告グループに属しているにもかかわらず、同じ検索キーワードを持つ行が重複して検索結果に表示されます。

{
  "results":[
    {
      "searchTermView":{
        "resourceName":"customers/1234567890/searchTermViews/111111111~2222222222~Z29vZ2xlIHBob3RvcyBpb3M",
        "searchTerm":"google photos"
      },
      "metrics":{
        "impressions":"3"
      },
      "segments":{
        "date":"2015-06-15"
      }
    },
    {
      "searchTermView":{
        "resourceName":"customers/1234567890/searchTermViews/111111111~33333333333~Z29vZ2xlIHBob3RvcyBpb3M",
        "searchTerm":"google photos"
      },
      "metrics":{
        "impressions":"2"
      },
      "segments":{
        "date":"2015-06-15"
      }
    }
  ]
}

この例で返される 2 つのオブジェクトは重複しているように見えますが、実際にはリソース名(特に「広告グループ」の部分)は異なります。つまり、「google フォト」という検索語句は、同じ日付(2015-06-15)の 2 つの広告グループ(ID 222222222233333333333)に関連付けられていることを意味します。したがって、API は意図したとおりに機能し、この場合は重複するオブジェクトが返されなかったと結論付けることができます。