Campaign Manager 전송

Campaign Manager 커넥터용 BigQuery Data Transfer Service를 사용하면 Campaign Manager 보고 데이터에 대해 반복되는 로드 작업을 자동으로 예약하고 관리할 수 있습니다.

지원되는 보고서

Campaign Manager용 BigQuery Data Transfer Service(이전의 DoubleClick Campaign Manager)는 다음과 같은 보고 옵션을 지원합니다.

Campaign Manager 보고서가 BigQuery 테이블 및 뷰로 변환되는 방식은 Campaign Manager 보고서 변환을 참조하세요.

보고 옵션 지원
반복 빈도

생성 시간을 기준으로 매 8시간

구성할 수 없음

새로고침 범위

지난 2일

구성할 수 없음

최대 백필 기간

최근 60일

Campaign Manager는 최대 60일 동안 데이터 전송 파일을 보관합니다. 60일이 지난 파일은 Campaign Manager에 의해 삭제됩니다.

Campaign Manager 전송에서 데이터 수집

Campaign Manager에서 BigQuery로 데이터를 전송할 때는 데이터가 날짜별로 파티션을 나눈 BigQuery 테이블에 로드됩니다. 데이터가 로드되는 테이블 파티션은 데이터 소스의 날짜에 해당합니다. 동일한 날짜에 여러 전송을 예약하면 BigQuery Data Transfer Service가 해당 날짜의 파티션을 최신 데이터로 덮어씁니다. 동일한 일자에 전송이 여러 개 있거나 백필을 실행해도 데이터가 중복되지 않으며 다른 일자의 파티션에 영향을 주지 않습니다.

새로고침 기간

새로고침 기간은 데이터 전송이 발생할 때 데이터 전송이 데이터를 검색하는 일 수입니다. 예를 들어 새로고침 기간이 3일이고 일일 전송이 발생하는 경우 BigQuery Data Transfer Service는 소스 테이블에서 지난 3일 동안의 모든 데이터를 검색합니다. 이 예시에서 일일 전송이 발생하면 BigQuery Data Transfer Service는 현재 날짜의 소스 테이블 데이터 사본이 포함된 새 BigQuery 대상 테이블 파티션을 만든 다음 백필 실행을 자동으로 트리거하여 BigQuery 대상 테이블 파티션을 지난 2일 동안의 소스 테이블 데이터로 업데이트합니다. 자동으로 트리거된 백필 실행은 BigQuery Data Transfer Service 커넥터에서 증분 업데이트가 지원되는지 여부에 따라 BigQuery 대상 테이블을 덮어쓰거나 증분 업데이트합니다.

데이터 전송을 처음 실행하면 데이터 전송이 새로고침 기간 내에 사용 가능한 모든 소스 데이터를 검색합니다. 예를 들어 새로고침 기간이 3일이고 데이터 전송을 처음 실행하는 경우 BigQuery Data Transfer Service는 3일 이내에 모든 소스 데이터를 검색합니다.

새로고침 기간은 TransferConfig.data_refresh_window_days API 필드에 매핑됩니다.

새로고침 기간 외의 데이터(예: 이전 데이터)를 검색하거나 전송 중단 또는 불일치 문제를 해결하려면 백필 실행을 시작하거나 예약하면 됩니다.

시작하기 전에

Campaign Manager 데이터 전송을 만들기 전에 다음을 수행하세요.

  • BigQuery Data Transfer Service 사용 설정에 필요한 모든 작업을 완료했는지 확인합니다.
  • Campaign Manager 데이터를 저장할 BigQuery 데이터 세트를 만듭니다.
  • 조직이 Campaign Manager 데이터 전송 v2(Campaign Manager DTv2) 파일에 액세스할 수 있어야 합니다. Campaign Manager 팀은 파일을 Cloud Storage 버킷으로 전달합니다. Campaign Manager DTv2 파일에 액세스하기 위한 다음 단계는 Campaign Manager와 직접 계약했는지 여부에 따라 달라집니다. 두 경우 모두 추가 수수료가 부과될 수 있습니다.

    • Campaign Manager와 계약한 경우, Campaign Manager 지원팀에 문의하여 Campaign Manager DTv2 파일을 설정합니다.
    • Campaign Manager와 계약을 하지 않은 경우, 대행사나 Campaign Manager 리셀러가 Campaign Manager DTv2 파일에 액세스할 수 있습니다. 이 파일에 액세스하려면 대행사나 리셀러에게 문의하세요.

    이 단계를 완료하면 다음과 비슷한 Cloud Storage 버킷 이름을 받습니다.

    dcdt_-dcm_account123456

  • Pub/Sub의 전송 실행 알림을 설정하려면 pubsub.topics.setIamPolicy 권한이 있어야 합니다. 자세한 내용은 BigQuery Data Transfer Service 실행 알림을 참조하세요.

필수 권한

  • BigQuery: 데이터 전송을 만드는 사람에게 다음과 같은 BigQuery의 권한이 있는지 확인합니다.

    • 데이터 전송을 만드는 bigquery.transfers.update 권한
    • 대상 데이터 세트에 대한 bigquery.datasets.getbigquery.datasets.update 권한

    사전 정의된 IAM 역할 bigquery.admin에는 bigquery.transfers.update, bigquery.datasets.update, bigquery.datasets.get 권한이 있습니다. BigQuery Data Transfer Service의 IAM 역할에 대한 자세한 내용은 액세스 제어를 확인하세요.

  • Campaign Manager: Cloud Storage에 저장된 Campaign Manager DTv2 파일에 대한 읽기 액세스. Cloud Storage 버킷을 제공한 항목이 액세스를 관리합니다.

Campaign Manager 전송 설정

Campaign Manager 데이터 전송을 설정하려면 다음 항목이 필요합니다.

  • Cloud Storage 버킷: 시작하기 전에 섹션에서 설명한 것처럼 Campaign Manager DTv2 파일의 Cloud Storage 버킷 URI입니다. 버킷 이름은 다음과 같아야 합니다.

    dcdt_-dcm_account123456

  • Campaign Manager ID: Campaign Manager 네트워크, 광고주, 플러드라이트 ID. 네트워크 ID는 계층 구조의 상위 항목입니다.

Campaign Manager ID 찾기

Campaign Manager ID를 검색하기 위해 Cloud Storage Console을 사용하여 Campaign Manager 데이터 전송 Cloud Storage 버킷에 있는 파일을 검사할 수 있습니다. Campaign Manager ID는 제공된 Cloud Storage 버킷에 있는 파일을 일치시키는 데 사용됩니다. ID는 파일 이름에 포함되며 Cloud Storage 버킷 이름에는 포함되지 않습니다.

예를 들면 다음과 같습니다.

  • 이름이 dcm_account123456_activity_*인 파일에서 ID는 123456입니다.
  • 이름이 dcm_floodlight7890_activity_*인 파일에서 ID는 7890입니다.
  • 이름이 dcm_advertiser567_activity_*인 파일에서 ID는 567입니다.

파일 이름 프리픽스 찾기

드물지만 Cloud Storage 버킷에 있는 파일의 이름이 Google Marketing Platform 서비스팀에서 사용자에게 설정한 커스텀 비표준 파일 이름인 경우가 있습니다.

예를 들면 다음과 같습니다.

  • 이름이 dcm_account123456custom_activity_*인 파일에서 프리픽스는 dcm_account123456custom(_activity 앞에 있는 모든 문자)입니다.

도움이 필요하면 Campaign Manager 지원팀에 문의하세요.

Campaign Manager용 데이터 전송 만들기

콘솔

  1. Google Cloud 콘솔의 데이터 전송 페이지로 이동합니다.

    데이터 전송으로 이동

  2. 전송 만들기를 클릭합니다.

  3. 전송 만들기 페이지에서 다음을 수행합니다.

    • 소스 유형 섹션에서 소스Campaign Manager를 선택합니다.

      전송 소스

    • 전송 구성 이름 섹션의 표시 이름에 데이터 전송 이름(예: My Transfer)을 입력합니다. 전송 이름은 나중에 수정해야 할 경우를 대비해 전송을 식별할 수 있는 값이면 됩니다.

      전송 이름

    • 일정 옵션 섹션의 일정에서 기본값(지금 시작)을 유지하거나 설정 시간에 시작을 클릭합니다.

      • 반복에서 전송을 실행하는 빈도 옵션을 선택합니다.

        • 매일(기본값)
        • 매주
        • 매월
        • 커스텀
        • 주문형

        매일 이외의 옵션을 선택하면 추가 옵션이 제공됩니다. 예를 들어 매주를 선택하면 요일을 선택할 수 있는 옵션이 나타납니다.

      • 시작일 및 실행 시간에 데이터 전송을 시작할 날짜 및 시간을 입력합니다. 지금 시작을 선택하면 이 옵션은 사용 중지됩니다.

        전송 일정

    • 대상 설정 섹션의 대상 데이터 세트에서 데이터를 저장하기 위해 만든 데이터 세트를 선택합니다.

      전송 데이터 세트

    • 데이터 소스 세부정보 섹션에서 다음을 수행합니다.

      • Cloud Storage 버킷의 경우 데이터 전송 V2.0 파일을 저장하는 Cloud Storage 버킷의 이름을 입력하거나 찾습니다. 버킷 이름에는 gs://가 포함되면 안 됩니다.
      • DoubleClick ID에 적절한 Campaign Manager ID를 입력합니다.
      • (선택사항) 파일 이름이 이 예시와 같은 표준 이름인 경우 파일 이름 프리픽스 필드를 공란으로 남겨둡니다. Cloud Storage 버킷의 파일에 커스텀 파일 이름이 포함된 경우 파일 이름 프리픽스를 지정합니다.

        Campaign Manager 소스 세부정보

    • (선택사항) 알림 옵션 섹션에서 다음을 수행합니다.

      • 전환을 클릭해서 이메일 알림을 사용 설정합니다. 이 옵션을 사용 설정하면 전송 실행이 실패할 때 전송 관리자에게 이메일 알림이 발송됩니다.
      • Pub/Sub 주제 선택에서 주제 이름을 선택하거나 주제 만들기를 클릭합니다. 이 옵션은 전송에 대한 Pub/Sub 실행 알림을 구성합니다.
  4. 저장을 클릭합니다.

bq

bq mk 명령어를 입력하고 전송 생성 플래그 --transfer_config를 지정합니다. 다음 플래그도 필요합니다.

  • --data_source
  • --target_dataset
  • --display_name
  • --params
bq mk --transfer_config \
--project_id=project_id \
--target_dataset=dataset \
--display_name=name \
--params='parameters' \
--data_source=data_source

각 항목의 의미는 다음과 같습니다.

  • project_id는 프로젝트 ID입니다.
  • dataset는 데이터 전송 구성의 대상 데이터 세트입니다.
  • name은 데이터 전송 구성의 표시 이름입니다. 전송 이름은 나중에 수정해야 할 경우를 대비해 전송을 식별할 수 있는 값이면 됩니다.
  • parameters에는 JSON 형식으로 생성된 데이터 전송 구성의 매개변수가 있습니다. 예를 들면 --params='{"param":"param_value"}'입니다. Campaign Manager의 경우 bucketnetwork_id 매개변수를 제공해야 합니다. bucket은 Campaign Manager DTv2 파일이 포함된 Cloud Storage 버킷입니다. network_id는 네트워크, 플러드라이트 또는 광고주 ID입니다.
  • data_source는 데이터 소스입니다. dcm_dt(Campaign Manager)

또한 --project_id 플래그를 입력하여 특정 프로젝트를 지정할 수도 있습니다. --project_id를 지정하지 않으면 기본 프로젝트가 사용됩니다.

예를 들어 다음 명령어는 Campaign Manager ID 123456, Cloud Storage 버킷 dcdt_-dcm_account123456, 대상 데이터 세트 mydataset를 사용하여 My Transfer라는 Campaign Manager 데이터 전송을 만듭니다. file_name_prefix 매개변수는 선택사항이며 커스텀 파일 이름인 경우에만 드물게 사용됩니다.

기본 프로젝트에 데이터 전송이 생성됩니다.

bq mk --transfer_config \
--target_dataset=mydataset \
--display_name='My Transfer' \
--params='{"bucket": "dcdt_-dcm_account123456","network_id": "123456","file_name_prefix":"YYY"}' \
--data_source=dcm_dt

명령어를 실행한 후 다음과 같은 메시지가 수신됩니다.

[URL omitted] Please copy and paste the above URL into your web browser and follow the instructions to retrieve an authentication code.

안내에 따라 인증 코드를 명령줄에 붙여넣습니다.

API

projects.locations.transferConfigs.create 메서드를 사용하고 TransferConfig 리소스의 인스턴스를 지정합니다.

자바

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Java 설정 안내를 따르세요. 자세한 내용은 BigQuery Java API 참고 문서를 확인하세요.

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import com.google.api.gax.rpc.ApiException;
import com.google.cloud.bigquery.datatransfer.v1.CreateTransferConfigRequest;
import com.google.cloud.bigquery.datatransfer.v1.DataTransferServiceClient;
import com.google.cloud.bigquery.datatransfer.v1.ProjectName;
import com.google.cloud.bigquery.datatransfer.v1.TransferConfig;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// Sample to create campaign manager transfer config
public class CreateCampaignmanagerTransfer {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    final String projectId = "MY_PROJECT_ID";
    String datasetId = "MY_DATASET_ID";
    String bucket = "gs://cloud-sample-data";
    // the network_id only allows digits
    String networkId = "7878";
    String fileNamePrefix = "test_";
    Map<String, Value> params = new HashMap<>();
    params.put("bucket", Value.newBuilder().setStringValue(bucket).build());
    params.put("network_id", Value.newBuilder().setStringValue(networkId).build());
    params.put("file_name_prefix", Value.newBuilder().setStringValue(fileNamePrefix).build());
    TransferConfig transferConfig =
        TransferConfig.newBuilder()
            .setDestinationDatasetId(datasetId)
            .setDisplayName("Your Campaignmanager Config Name")
            .setDataSourceId("dcm_dt")
            .setParams(Struct.newBuilder().putAllFields(params).build())
            .build();
    createCampaignmanagerTransfer(projectId, transferConfig);
  }

  public static void createCampaignmanagerTransfer(String projectId, TransferConfig transferConfig)
      throws IOException {
    try (DataTransferServiceClient client = DataTransferServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      CreateTransferConfigRequest request =
          CreateTransferConfigRequest.newBuilder()
              .setParent(parent.toString())
              .setTransferConfig(transferConfig)
              .build();
      TransferConfig config = client.createTransferConfig(request);
      System.out.println("Campaignmanager transfer created successfully :" + config.getName());
    } catch (ApiException ex) {
      System.out.print("Campaignmanager transfer was not created." + ex.toString());
    }
  }
}

Campaign Manager 전송 설정 문제 해결

데이터 전송을 설정하는 데 문제가 발생하면 전송 구성 문제 해결Campaign Manager 전송 문제를 참조하세요.

데이터 쿼리

BigQuery로 전송되는 데이터는 내부 데이터화 시간별로 파티션을 나눈 테이블에 기록됩니다. 자세한 내용은 파티션을 나눈 테이블 소개를 참조하세요.

자동 생성된 뷰를 사용하지 않고 직접 테이블을 쿼리하는 경우에는 쿼리에서 _PARTITIONTIME 유사 열을 사용해야 합니다. 자세한 내용은 파티션을 나눈 테이블 쿼리를 참조하세요.

Campaign Manager 샘플 쿼리

다음 Campaign Manager 샘플 쿼리를 사용하여 전송된 데이터를 분석할 수 있습니다. Looker Studio와 같은 시각화 도구에서 쿼리를 사용할 수도 있습니다. BigQuery로 Campaign Manager 데이터 쿼리를 시작하는 데 유용합니다. 이 보고서로 할 수 있는 작업에 대해 추가 문의 사항이 있는 경우, Campaign Manager 기술 담당자에게 문의하세요.

다음 각 쿼리에서 dataset와 같은 변수를 실제 값으로 바꿉니다.

최신 캠페인

다음 SQL 샘플 쿼리는 최신 캠페인을 가져옵니다.

SELECT
  Campaign,
  Campaign_ID
FROM
  `dataset.match_table_campaigns_campaign_manager_id`
WHERE
  _DATA_DATE = _LATEST_DATE

캠페인별 노출 수 및 고유 사용자 수

다음 SQL 샘플 쿼리는 지난 30일 동안의 캠페인별 노출 수와 고유 사용자 수를 분석합니다.

# START_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
# END_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
  SELECT
    Campaign_ID,
    _DATA_DATE AS Date,
    COUNT(*) AS count,
    COUNT(DISTINCT User_ID) AS du
  FROM
    `dataset.impression_campaign_manager_id`
  WHERE
    _DATA_DATE BETWEEN start_date
    AND end_date
  GROUP BY
    Campaign_ID,
    Date

캠페인 및 날짜별로 최신 캠페인 정렬

다음 SQL 샘플 쿼리는 지난 30일 동안의 최신 캠페인을 캠페인과 날짜별로 정렬하여 분석합니다.

# START_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
# END_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
SELECT
  Campaign,
  Campaign_ID,
  Date
FROM (
  SELECT
    Campaign,
    Campaign_ID
  FROM
    `dataset.match_table_campaigns_campaign_manager_id`
  WHERE
    _DATA_DATE = _LATEST_DATE ),
  (
  SELECT
    date AS Date
  FROM
    `bigquery-public-data.utility_us.date_greg`
  WHERE
    Date BETWEEN start_date
    AND end_date )
ORDER BY
  Campaign_ID,
  Date

날짜 범위 내 캠페인별 노출 수 및 고유 사용자 수

다음 SQL 샘플 쿼리는 start_date ~ end_date 사이의 캠페인별 노출 수와 개별 사용자 수를 분석합니다.

# START_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
# END_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
SELECT
  base.*,
  imp.count AS imp_count,
  imp.du AS imp_du
FROM (
  SELECT
    *
  FROM (
    SELECT
      Campaign,
      Campaign_ID
    FROM
      `dataset.match_table_campaigns_campaign_manager_id`
    WHERE
      _DATA_DATE = _LATEST_DATE ),
    (
    SELECT
      date AS Date
    FROM
      `bigquery-public-data.utility_us.date_greg`
    WHERE
      Date BETWEEN start_date
      AND end_date ) ) AS base
LEFT JOIN (
  SELECT
    Campaign_ID,
    _DATA_DATE AS Date,
    COUNT(*) AS count,
    COUNT(DISTINCT User_ID) AS du
  FROM
    `dataset.impression_campaign_manager_id`
  WHERE
    _DATA_DATE BETWEEN start_date
    AND end_date
  GROUP BY
    Campaign_ID,
    Date ) AS imp
ON
  base.Campaign_ID = imp.Campaign_ID
  AND base.Date = imp.Date
WHERE
  base.Campaign_ID = imp.Campaign_ID
  AND base.Date = imp.Date
ORDER BY
  base.Campaign_ID,
  base.Date

캠페인별 노출 수, 클릭 수, 활동 수, 고유 사용자 수

다음 SQL 샘플 쿼리는 지난 30일 동안의 캠페인별 노출 수, 클릭 수, 활동 수, 고유 사용자 수를 분석합니다. 이 쿼리에서 campaign_list와 같은 변수를 실제 값으로 바꿉니다. 예를 들어 campaign_list를 쿼리 범위 내의 관심 있는 모든 Campaign Manager 캠페인이 나열된 쉼표로 구분된 목록으로 바꿉니다.

# START_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
# END_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
SELECT
  base.*,
  imp.count AS imp_count,
  imp.du AS imp_du,
  click.count AS click_count,
  click.du AS click_du,
  activity.count AS activity_count,
  activity.du AS activity_du
FROM (
  SELECT
    *
  FROM (
    SELECT
      Campaign,
      Campaign_ID
    FROM
      `dataset.match_table_campaigns_campaign_manager_id`
    WHERE
      _DATA_DATE = _LATEST_DATE ),
    (
    SELECT
      date AS Date
    FROM
      `bigquery-public-data.utility_us.date_greg`
    WHERE
      Date BETWEEN DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
      AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY) ) ) AS base
LEFT JOIN (
  SELECT
    Campaign_ID,
    _DATA_DATE AS Date,
    COUNT(*) AS count,
    COUNT(DISTINCT User_ID) AS du
  FROM
    `dataset.impression_campaign_manager_id`
  WHERE
    _DATA_DATE BETWEEN DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
    AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
  GROUP BY
    Campaign_ID,
    Date ) AS imp
ON
  base.Campaign_ID = imp.Campaign_ID
  AND base.Date = imp.Date
LEFT JOIN (
  SELECT
    Campaign_ID,
    _DATA_DATE AS Date,
    COUNT(*) AS count,
    COUNT(DISTINCT User_ID) AS du
  FROM
    `dataset.click_campaign_manager_id`
  WHERE
    _DATA_DATE BETWEEN DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
    AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
  GROUP BY
    Campaign_ID,
    Date ) AS click
ON
  base.Campaign_ID = click.Campaign_ID
  AND base.Date = click.Date
LEFT JOIN (
  SELECT
    Campaign_ID,
    _DATA_DATE AS Date,
    COUNT(*) AS count,
    COUNT(DISTINCT User_ID) AS du
  FROM
    `dataset.activity_campaign_manager_id`
  WHERE
    _DATA_DATE BETWEEN DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
    AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
  GROUP BY
    Campaign_ID,
    Date ) AS activity
ON
  base.Campaign_ID = activity.Campaign_ID
  AND base.Date = activity.Date
WHERE
  base.Campaign_ID IN campaign_list
  AND (base.Date = imp.Date
    OR base.Date = click.Date
    OR base.Date = activity.Date)
ORDER BY
  base.Campaign_ID,
  base.Date

캠페인 활동

다음 SQL 샘플 쿼리는 지난 30일 동안의 캠페인 활동을 분석합니다. 이 쿼리에서 campaign_list와 같은 변수를 실제 값으로 바꿉니다. 예를 들어 campaign_list를 쿼리 범위 내의 관심 있는 모든 Campaign Manager 캠페인이 나열된 쉼표로 구분된 목록으로 바꿉니다.

# START_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
# END_DATE = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
SELECT
  base.*,
  activity.count AS activity_count,
  activity.du AS activity_du
FROM (
  SELECT
    *
  FROM (
    SELECT
      Campaign,
      Campaign_ID
    FROM
      `dataset.match_table_campaigns_campaign_manager_id`
    WHERE
      _DATA_DATE = _LATEST_DATE ),
    (
    SELECT
      mt_at.Activity_Group,
      mt_ac.Activity,
      mt_ac.Activity_Type,
      mt_ac.Activity_Sub_Type,
      mt_ac.Activity_ID,
      mt_ac.Activity_Group_ID
    FROM
      `dataset.match_table_activity_cats_campaign_manager_id` AS mt_ac
    JOIN (
      SELECT
        Activity_Group,
        Activity_Group_ID
      FROM
        `dataset.match_table_activity_types_campaign_manager_id`
      WHERE
        _DATA_DATE = _LATEST_DATE ) AS mt_at
    ON
      mt_at.Activity_Group_ID = mt_ac.Activity_Group_ID
    WHERE
      _DATA_DATE = _LATEST_DATE ),
    (
    SELECT
      date AS Date
    FROM
      `bigquery-public-data.utility_us.date_greg`
    WHERE
      Date BETWEEN start_date
      AND end_date ) ) AS base
LEFT JOIN (
  SELECT
    Campaign_ID,
    Activity_ID,
    _DATA_DATE AS Date,
    COUNT(*) AS count,
    COUNT(DISTINCT User_ID) AS du
  FROM
    `dataset.activity_campaign_manager_id`
  WHERE
    _DATA_DATE BETWEEN DATE_ADD(CURRENT_DATE(), INTERVAL -31 DAY)
    AND DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
  GROUP BY
    Campaign_ID,
    Activity_ID,
    Date ) AS activity
ON
  base.Campaign_ID = activity.Campaign_ID
  AND base.Activity_ID = activity.Activity_ID
  AND base.Date = activity.Date
WHERE
  base.Campaign_ID IN campaign_list
  AND base.Activity_ID = activity.Activity_ID
ORDER BY
  base.Campaign_ID,
  base.Activity_Group_ID,
  base.Activity_ID,
  base.Date