分割

Google Ads 界面中提供了一个单独的菜单,用于进行细分。您可以通过向查询添加适当的字段,在 Google Ads API 中实现细分。例如,假设您向查询添加了 segments.device 。这样一来,系统就会生成一份报告,其中包含一个行,用于显示设备 和 FROM 子句中指定资源的每种组合,以及 在它们之间 拆分的统计值(展示次数、点击次数、转化次数等)。

在 Google Ads 界面中,一次只能使用一个细分,但使用 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"
      }
    },
    ...
  ]
}

在此示例结果中,第一个和第二个对象的属性(包括资源名称)是相同的。展示次数按设备细分,因此,对于同一广告系列,可能会返回两个或更多对象。

隐式细分

每份报告最初都是按 FROM 子句中指定的资源进行细分的。即使查询中未明确包含 resource_name 字段,系统也会返回 FROM 子句中资源的 resource_name 字段,并按该字段细分指标。例如,如果您在FROM子句中将 ad_group指定为资源,系统会自动返回 ad_group.resource_name,并且指标会隐式地按 广告组级别进行细分。

因此,对于此查询,

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"
      }
    }
  ]
}

adGroupresource_name 字段始终会返回,因为 ad_groupFROM 子句中被指定为资源。

可选择的细分字段

并非所有细分字段都可供 FROM 子句中的给定资源选择。 例如,假设您继续查询 ad_group 资源。如需从 ad_group 资源中选择细分字段,该字段需要存在于 ad_group 的 Segments 列表中。Segments 列表是可用字段 表的黄色部分,位于 ad_group 资源的元数据页面上。

细分资源

从某些资源中进行选择时,您或许可以选择与相关资源进行隐式连接,方法是选择这些资源中的字段以及 FROM 子句中资源的字段。您可以在 FROM 子句中资源的元数据页面上的 Attributed Resources 列表中找到这些相关资源。对于 ad_group 资源,您会看到 您还可以从 campaign 资源中选择字段。对于 SELECT 子句中至少包含一个字段的任何 Attributed Resources,系统会自动返回其 resource_name 字段,即使查询中未明确包含该字段也是如此。

与选择 Attributed Resource 字段类似,您还可以选择 Segmenting Resource 字段。如果给定资源的元数据页面上有一个 Segmenting Resources 列表,那么如果您从其中一个列出的 资源中选择字段,系统就会按该 Segmenting Resource 返回的 resource_name 进一步细分查询。例如,您会发现 campaign资源被列为Segmenting Resourcecampaign_budget资源的资源。 从 campaign_budget 资源中选择任何广告系列字段(例如 campaign.name)不仅会导致返回 campaign.name 字段,还会导致返回 campaign.resource_name 字段 并按该字段进行细分。

细分和指标之间的可选择性

给定的细分字段可能与其他一些细分字段或一些指标字段不兼容。如需确定哪些细分字段彼此兼容,请查看 SELECT 子句中细分的 selectable_with 列表。

对于 ad_group 资源,您可以选择 50+ 个可用的细分。不过,selectable_with 列表 segments.hotel_check_in_date 是一组小得多的兼容细分。这意味着,如果您将 segments.hotel_check_in_date 字段添加到 SELECT 子句中,您可选择的剩余细分将仅限于这两个列表的交集。

按细分选择进行隐式过滤

当您在查询中选择某些细分字段时,Google Ads API 可能会隐式过滤结果,以仅包含该细分适用且具有值的行。

segments.keyword.* 的影响

当您选择 segments.keyword 下的任何字段 (例如 segments.keyword.info.textsegments.keyword.ad_group_criterion)时,就会出现这种行为,这是一个常见且重要的示例。

  • 排除非关键字流量 :如果您在 SELECT 子句中包含任何 segments.keyword.* 字段,则结果将仅限于与搜索网络关键字广告组条件直接关联的行。
  • 受影响的广告系列类型 :因此,不依赖于搜索关键字的广告系列类型或广告组中的数据将从结果中排除 。其中包括但不限于:

    • 动态搜索广告 (DSA) :因为 DSA 定位条件基于网站内容,而不是关键字。
    • 购物广告系列 :使用产品组而不是关键字。
    • 效果最大化广告系列 :虽然效果最大化广告系列可能会在搜索网络上投放,但其报告通常不会按相同的关键字条件进行细分。
  • 展示广告网络segments.keyword.* 字段与搜索网络 上使用的关键字有关。它们不会按展示广告网络关键字或其他展示广告定位方式进行细分。

最佳实践 :如果您的分析需要包含来自动态搜索广告、购物广告系列或其他非搜索关键字来源的效果数据,请不要在查询中包含 segments.keyword.* 中的字段。首先分析所有广告系列类型的数据,仅在专注于搜索广告关键字效果时应用关键字细分。

WHERE 子句中细分的规则

当细分位于 WHERE 子句中时,它也必须位于 SELECT 子句中。 此规则的例外情况是以下日期细分,这些细分称为 核心日期细分

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

核心日期细分字段的规则

segments.datesegments.weeksegments.monthsegments.quartersegments.year 细分的功能如下:

  • 这些细分可以在 WHERE 子句中进行过滤,而无需显示在 SELECT 子句中。

  • 如果这些细分中的任何一个位于 SELECT 子句中,则必须在 WHERE 子句中指定由 核心日期细分 组成的有限日期范围。日期细分不需要与 SELECT 中指定的日期细分相同。

示例

无效:由于 segments.date 位于 SELECT 子句中,因此您需要在 WHERE 子句中为 segments.datesegments.weeksegments.monthsegments.quartersegments.year 指定有限的日期范围。
SELECT
  campaign.name,
  metrics.clicks,
  segments.date
FROM campaign
有效:此查询会返回广告系列名称以及在日期范围内累积的 点击次数。请注意,segments.date 不需要显示在 SELECT 子句中。
SELECT
  campaign.name,
  metrics.clicks
FROM campaign
WHERE segments.date > '2024-01-01'
  AND segments.date < '2024-02-01'
有效:此查询会返回广告系列名称以及在日期范围内所有日期按日期细分的点击次数。
SELECT
  campaign.name,
  metrics.clicks,
  segments.date
FROM campaign
WHERE segments.date > '2024-01-01'
  AND segments.date < '2024-02-01'
有效:此查询会返回广告系列名称以及在日期范围内所有日期按月份细分的点击次数。
SELECT
  campaign.name,
  metrics.clicks,
  segments.month
FROM campaign
WHERE segments.date > '2024-01-01'
  AND segments.date < '2024-02-01'
有效:此查询会返回广告系列名称以及在年份范围内所有月份按季度细分,然后按月份细分的点击次数。
SELECT
  campaign.name,
  metrics.clicks,
  segments.quarter,
  segments.month
FROM campaign
WHERE segments.year > 2019
  AND segments.year < 2024

search_term_view

search_term_view 资源也会按广告组(而不仅仅是搜索字词)进行隐式 细分,这体现在其 资源名称的结构中, 其中还包含广告组。因此,您会在结果中看到一些看似重复的行,其中显示了相同的搜索字词,但这些行属于不同的广告组。

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

虽然此示例中的两个返回对象看起来是重复的,但它们的资源名称实际上是不同的,尤其是在“广告组”部分。这意味着,搜索字词“google photos”归因于同一日期 (2024-06-15) 的两个广告组(ID 为 222222222233333333333)。因此,我们可以得出结论,API 运行正常,在这种情况下没有返回重复的对象。