세분화

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

위의 샘플 결과에서 리소스 이름을 포함한 첫 번째 및 두 번째 객체의 속성은 동일합니다. 노출수는 기기별로 분류되므로 동일한 캠페인에 대해 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"
      }
    }
  ]
}

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가 의도한 대로 작동했으며 이 경우 중복 객체를 반환하지 않았다고 결론을 내릴 수 있습니다.