세분화

Google Ads UI에서 별도의 메뉴로 제공되는 세분화는 쿼리에 적절한 필드를 추가하기만 하면 Google Ads API에서 구현할 수 있습니다. 예를 들어 쿼리에 segments.device를 추가하면 FROM에 기기와 지정된 리소스의 각 조합에 대한 행과 이들 간에 분할된 통계 값 (노출수, 클릭수, 전환수 등)에 대한 행이 포함된 보고서가 생성됩니다.

Google Ads UI에서는 한 번에 하나의 세그먼트만 사용할 수 있지만 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 절에 지정된 리소스를 기준으로 분류됩니다. FROM 절에 있는 리소스의 resource_name 필드가 반환되고 이 필드를 기준으로 측정항목이 세분화됩니다. 이는 resource_name 필드가 쿼리에 명시적으로 포함되지 않은 경우에도 마찬가지입니다. 예를 들어 ad_groupFROM 절의 리소스로 지정하면 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"
      }
    }
  ]
}

ad_groupFROM 절에서 리소스로 지정되었으므로 adGroupresource_name 필드는 항상 반환됩니다.

선택 가능한 세그먼트 필드

FROM 절의 특정 리소스에 대해 일부 세그먼트 필드를 선택할 수 없습니다. 예를 들어 계속 ad_group 리소스에서 쿼리합니다. ad_group 리소스에서 세그먼트 필드를 선택할 수 있으려면 해당 필드가 ad_group의 Segments 목록에 있어야 합니다. Segments 목록은 ad_group 리소스의 메타데이터 페이지에서 사용 가능한 필드 테이블의 노란색 부분입니다.

세그먼트 리소스

일부 리소스에서 선택할 때 FROM 절의 리소스 필드 옆에 있는 필드를 선택하여 관련 리소스를 암시적으로 조인할 수 있습니다. 이러한 관련 리소스는 FROM 절의 메타데이터 페이지에 있는 리소스의 Attributed Resources 목록에서 찾을 수 있습니다. ad_group 리소스의 경우 campaign 리소스에서도 필드를 선택할 수 있습니다. SELECT 절에 1개 이상의 필드가 있는 Attributed Resources의 resource_name 필드는 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 절에 추가하면 선택할 수 있는 세그먼트를 이 두 목록의 교집합으로 제한합니다.

일부 세그먼트를 추가하면 요약 행의 측정항목이 감소할 수 있습니다.
segments.keyword.info.match_typeFROM ad_group_ad가 있는 쿼리에 추가되면 해당 세그먼트는 키워드가 있는 데이터 행 가져오고 키워드와 연결되지 않은 행을 삭제하도록 쿼리에 지시합니다. 이 경우 키워드 이외의 측정항목은 모두 제외되므로 측정항목이 낮아집니다.

WHERE 절의 세그먼트 규칙

세그먼트가 WHERE 절에 있으면 SELECT 절에도 있어야 합니다. 핵심 날짜 세그먼트라고 하는 다음과 같은 날짜 세그먼트는 이 규칙에서 예외입니다.

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

핵심 날짜 세그먼트 필드 규칙

세그먼트 segments.date, segments.week, segments.month, segments.quarter, segments.year는 다음과 같이 작동합니다.

  • 이러한 세그먼트는 SELECT 절에 나타나지 않고 WHERE 절에서 필터링할 수 있습니다.

  • 이러한 세그먼트가 SELECT 절에 있는 경우 핵심 날짜 세그먼트로 구성된 유한한 기간은 WHERE 절에 지정되어야 합니다(날짜 세그먼트는 SELECT에 지정된 세그먼트와 동일할 필요가 없음).

무효: segments.dateSELECT 절에 있으므로 segments.date, segments.week, segments.month, segments.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"
      }
    }
  ]
}

이 예에서 반환된 두 객체가 중복되는 것처럼 보이지만 실제로는 '광고그룹' 부분에서 리소스 이름이 다릅니다. 즉, 검색어 'Google 포토'는 같은 날짜 (2015년 6월 15일)에 두 개의 광고그룹 (ID 222222222233333333333)에 속합니다. 따라서 이 경우 API가 의도대로 작동했고 중복 객체를 반환하지 않았다고 결론을 내릴 수 있습니다.