Caricare i dati di Campaign Manager in BigQuery

Puoi caricare i dati da Campaign Manager a BigQuery utilizzando il BigQuery Data Transfer Service per Campaign Manager. Con BigQuery Data Transfer Service, puoi pianificare job di trasferimento ricorrenti che aggiungono i dati più recenti da Campaign Manager a BigQuery.

Panoramica del connettore

BigQuery Data Transfer Service per il connettore Campaign Manager supporta le seguenti opzioni per il trasferimento dei dati.

Per informazioni su come i report di Campaign Manager vengono trasformati in tabelle e visualizzazioni BigQuery, consulta Trasformazioni dei report di Campaign Manager.

Opzioni di trasferimento dei dati Assistenza
Report supportati Il connettore Campaign Manager supporta il trasferimento di dati dai seguenti report:
Frequenza di ripetizione Il connettore Campaign Manager supporta il trasferimento dei dati ogni 8 ore.

Per impostazione predefinita, i trasferimenti di dati di Campaign Manager vengono pianificati al momento della creazione del trasferimento di dati.
Finestra di aggiornamento Il connettore Campaign Manager recupera i dati di Campaign Manager fino a 2 giorni al momento dell'esecuzione del trasferimento di dati. Non puoi configurare la finestra di aggiornamento per questo connettore.

Per maggiori informazioni, vedi Finestre di aggiornamento.
Disponibilità dei dati di backfill Esegui un backfill dei dati per recuperare i dati al di fuori del trasferimento di dati pianificato. Puoi recuperare i dati fino a quando la policy di conservazione dei dati sull'origine dati lo consente.

Per informazioni sulla policy di conservazione dei dati per Display & Video 360, consulta Controlli di eliminazione e conservazione dei dati.

Importazione dei dati dai trasferimenti di Campaign Manager

Quando trasferisci i dati da Campaign Manager a BigQuery, i dati vengono caricati nelle tabelle BigQuery partizionate per data. La partizione della tabella in cui vengono caricati i dati corrisponde alla data dell'origine dati. Se pianifichi più trasferimenti per la stessa data, BigQuery Data Transfer Service sovrascrive la partizione per quella data specifica con i dati più recenti. Più trasferimenti nello stesso giorno o l'esecuzione di backfill non comportano la duplicazione dei dati e le partizioni per altre date non vengono interessate.

Finestre di aggiornamento

Una finestra di aggiornamento è il numero di giorni in cui un trasferimento di dati recupera i dati quando si verifica un trasferimento di dati. Ad esempio, se la finestra di aggiornamento è di tre giorni e si verifica un trasferimento giornaliero, BigQuery Data Transfer Service recupera tutti i dati dalla tabella di origine degli ultimi tre giorni. In questo esempio, quando si verifica un trasferimento giornaliero, BigQuery Data Transfer Service crea una nuova partizione della tabella di destinazione BigQuery con una copia dei dati della tabella di origine del giorno corrente, quindi attiva automaticamente le esecuzioni di backfill per aggiornare le partizioni della tabella di destinazione BigQuery con i dati della tabella di origine degli ultimi due giorni. Le esecuzioni di backfill attivate automaticamente sovrascriveranno o aggiorneranno in modo incrementale la tabella di destinazione BigQuery, a seconda che gli aggiornamenti incrementali siano supportati o meno nel connettore BigQuery Data Transfer Service.

Quando esegui un trasferimento di dati per la prima volta, il trasferimento di dati recupera tutti i dati di origine disponibili nella finestra di aggiornamento. Ad esempio, se la finestra di aggiornamento è di tre giorni e esegui il trasferimento di dati per la prima volta, BigQuery Data Transfer Service recupera tutti i dati di origine entro tre giorni.

Per recuperare i dati al di fuori della finestra di aggiornamento, ad esempio i dati storici, o per recuperare i dati da eventuali interruzioni o lacune del trasferimento, puoi avviare o pianificare un' esecuzione di backfill.

Prima di iniziare

Prima di creare un trasferimento di dati di Campaign Manager:

  • Verifica di aver completato tutte le azioni necessarie per abilitare BigQuery Data Transfer Service.
  • Crea un set di dati BigQuery per archiviare i dati di Campaign Manager.
  • Assicurati che la tua organizzazione abbia accesso ai file Data Transfer v2 (Campaign Manager DTv2) di Campaign Manager. Questi file vengono forniti dal team di Campaign Manager a un bucket Cloud Storage. Per ottenere l'accesso ai file Campaign Manager DTv2, il passaggio successivo dipende dal fatto che tu abbia o meno un contratto diretto con Campaign Manager. In entrambi i casi, potrebbero essere applicati costi aggiuntivi.

    • Se hai un contratto con Campaign Manager, contatta l'assistenza di Campaign Manager per configurare i file Campaign Manager DTv2.
    • Se non hai un contratto con Campaign Manager, la tua agenzia o il tuo rivenditore Campaign Manager potrebbe avere accesso ai file Campaign Manager DTv2. Contatta la tua agenzia o il tuo rivenditore per accedere a questi file.

    Al termine di questo passaggio, riceverai un nome del bucket Cloud Storage simile al seguente:

    dcdt_-dcm_account123456

  • Se intendi configurare le notifiche di esecuzione del trasferimento per Pub/Sub, devi disporre delle autorizzazioni pubsub.topics.setIamPolicy. Per maggiori informazioni, consulta Notifiche di esecuzione di BigQuery Data Transfer Service.

Autorizzazioni obbligatorie

Assicurati di aver concesso le seguenti autorizzazioni.

Ruoli BigQuery obbligatori

Per ottenere le autorizzazioni necessarie per creare un trasferimento di dati BigQuery Data Transfer Service, chiedi all'amministratore di concederti il ruolo IAM di amministratore BigQuery (roles/bigquery.admin) nel tuo progetto. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene le autorizzazioni necessarie per creare un trasferimento di dati BigQuery Data Transfer Service. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per creare un trasferimento di dati BigQuery Data Transfer Service sono necessarie le seguenti autorizzazioni:

  • Autorizzazioni BigQuery Data Transfer Service:
    • bigquery.transfers.update
    • bigquery.transfers.get
  • Autorizzazioni BigQuery:
    • bigquery.datasets.get
    • bigquery.datasets.getIamPolicy
    • bigquery.datasets.update
    • bigquery.datasets.setIamPolicy
    • bigquery.jobs.create

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Per maggiori informazioni, consulta Concedere l'accesso bigquery.admin.

Ruoli Campaign Manager obbligatori

Concedi l'accesso in lettura ai file Campaign Manager DTv2 archiviati in Cloud Storage. L'accesso è gestito dall'entità da cui hai ricevuto il bucket Cloud Storage.

Configurare un trasferimento Campaign Manager

Per configurare un trasferimento di dati di Campaign Manager è necessario:

  • Bucket Cloud Storage: l'URI del bucket Cloud Storage per i file Campaign Manager DTv2, come descritto in Prima di iniziare. Il nome del bucket dovrebbe avere il seguente aspetto:

    dcdt_-dcm_account123456

  • ID Campaign Manager: l'ID rete, inserzionista o Floodlight di Campaign Manager. L'ID rete è il parent nella gerarchia.

Trovare l'ID Campaign Manager

Per recuperare l'ID Campaign Manager, puoi utilizzare la console Cloud Storage per esaminare i file nel bucket Cloud Storage di Campaign Manager Data Transfer. L'ID Campaign Manager viene utilizzato per trovare le corrispondenze dei file nel bucket Cloud Storage fornito. L'ID è incorporato nel nome del file, non nel nome del bucket Cloud Storage.

Ad esempio:

  • In un file denominato dcm_account123456_activity_*, l'ID è 123456.
  • In un file denominato dcm_floodlight7890_activity_*, l'ID è 7890.
  • In un file denominato dcm_advertiser567_activity_*, l'ID è 567.

Trovare il prefisso del nome file

In rari casi, i file nel bucket Cloud Storage potrebbero avere nomi file personalizzati e non standard configurati per te dal team dei servizi Google Marketing Platform.

Ad esempio:

  • In un file denominato dcm_account123456custom_activity_*, il prefisso è dcm_account123456custom , ovvero tutto ciò che precede _activity.

Contatta l'assistenza di Campaign Manager se hai bisogno di aiuto.

Creare un trasferimento di dati per Campaign Manager

Console

  1. Vai alla pagina Trasferimenti di dati nella Google Cloud console.

    Vai a Trasferimenti di dati

  2. Fai clic su Crea trasferimento.

  3. Nella pagina Crea trasferimento:

    • Nella sezione Tipo di origine, per Origine, scegli Campaign Manager.

      Origine del trasferimento

    • Nella sezione Nome configurazione di trasferimento , per Nome visualizzato, inserisci un nome per il trasferimento di dati, ad esempio My Transfer. Il nome del trasferimento può essere qualsiasi valore che ti consenta di identificare il trasferimento se devi modificarlo in un secondo momento.

      Nome trasferimento

    • Nella sezione Opzioni di pianificazione, per Pianifica, lascia il valore predefinito (Inizia ora) o fai clic su Inizia a un'ora specifica.

      • Per Si ripete, scegli un'opzione per la frequenza con cui eseguire il trasferimento. Se scegli un'opzione diversa da Giornaliera, sono disponibili altre opzioni. Ad esempio, se scegli Settimanale, viene visualizzata un'opzione per selezionare il giorno della settimana.
      • Per Data di inizio e ora di esecuzione, inserisci la data e l'ora di inizio del trasferimento di dati. Se scegli Inizia ora, questa opzione è disabilitata.
    • Nella sezione Impostazioni destinazione, in Set di dati di destinazione, scegli il set di dati che hai creato per archiviare i dati.

      Trasferire il set di dati

    • Nella sezione Dettagli origine dati:

      • Per Bucket Cloud Storage, inserisci o cerca il nome del bucket Cloud Storage in cui sono archiviati i file di Data Transfer V2.0. Quando inserisci il nome del bucket, non includere gs://.
      • In ID DoubleClick, inserisci l'ID Campaign Manager appropriato.
      • (Facoltativo) Se i file hanno nomi standard come questi esempi, lascia vuoto il campo Prefisso del nome del file. Specifica un prefisso del nome file se i file nel bucket Cloud Storage hanno nomi personalizzati nomi.

      Dettagli sull'origine Campaign Manager

    • (Facoltativo) Nella sezione Opzioni di notifica:

      • Fai clic sul pulsante di attivazione/disattivazione per abilitare le notifiche via email. Quando attivi questa opzione, l'amministratore del trasferimento riceve una notifica via email quando l'esecuzione di un trasferimento non riesce.
      • In Seleziona un argomento Pub/Sub, scegli il nome dell'argomento o fai clic su Crea un argomento. Questa opzione configura l'esecuzione delle notifiche di Pub/Sub in relazione al trasferimento.
  4. Fai clic su Salva.

bq

Inserisci il comando bq mk e fornisci il flag di creazione del trasferimento --transfer_config. Sono necessari anche i seguenti flag:

  • --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

Dove:

  • project_id è l'ID progetto.
  • dataset è il set di dati di destinazione per la configurazione del trasferimento di dati.
  • name è il nome visualizzato per la configurazione del trasferimento di dati. Il nome del trasferimento può essere qualsiasi valore che ti consenta di identificare il trasferimento se devi modificarlo in un secondo momento.
  • parameters contiene i parametri per la configurazione del trasferimento di dati creata in formato JSON. Ad esempio: --params='{"param":"param_value"}'. Per Campaign Manager, devi fornire i parametri bucket e network_id. bucket è il bucket Cloud Storage che contiene i file Campaign Manager DTv2. network_id è l'ID rete, Floodlight o inserzionista.
  • data_source è l'origine dati: dcm_dt (Campaign Manager).

Puoi anche fornire il flag --project_id per specificare un progetto particolare. Se --project_id non è specificato, viene utilizzato il progetto predefinito.

Ad esempio, il seguente comando crea un trasferimento di dati di Campaign Manager denominato My Transfer utilizzando l'ID Campaign Manager 123456, il bucket Cloud Storage dcdt_-dcm_account123456 e il set di dati di destinazione mydataset. Il parametro file_name_prefix è facoltativo e viene utilizzato solo per nomi file personalizzati e rari.

Il trasferimento di dati viene creato nel progetto predefinito:

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

Dopo aver eseguito il comando, riceverai un messaggio simile al seguente:

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

Segui le istruzioni e incolla il codice di autenticazione nella riga di comando.

API

Utilizza il projects.locations.transferConfigs.create metodo e fornisci un'istanza della TransferConfig risorsa.

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per maggiori informazioni, consulta la documentazione di riferimento dell'Java API di BigQuery.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.

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());
    }
  }
}

Risolvere i problemi di configurazione del trasferimento di Campaign Manager

Se riscontri problemi durante la configurazione del trasferimento di dati, consulta Problemi di trasferimento di Campaign Manager in Risolvere i problemi di configurazione del trasferimento.

Eseguire query sui dati

Quando vengono trasferiti a BigQuery, i tuoi dati vengono scritti in tabelle partizionate per data di importazione. Per maggiori informazioni, consulta Introduzione alle tabelle partizionate.

Se esegui query direttamente sulle tabelle anziché utilizzare le visualizzazioni generate automaticamente, devi utilizzare la pseudocolonna _PARTITIONTIME nella query. Per ulteriori informazioni, consulta Esecuzione di query sulle tabelle partizionate.

Query di esempio di Campaign Manager

Puoi utilizzare le seguenti query di esempio di Campaign Manager per analizzare i dati trasferiti. Puoi anche utilizzare le query in uno strumento di visualizzazione come Data Studio. Queste query sono fornite per aiutarti a iniziare a eseguire query sui dati di Campaign Manager con BigQuery. Per ulteriori domande su cosa puoi fare con questi report, contatta il tuo rappresentante tecnico di Campaign Manager.

In ognuna delle seguenti query, sostituisci le variabili come dataset con i tuoi valori.

Campagne più recenti

La seguente query SQL di esempio recupera le campagne più recenti.

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

Impressioni e utenti distinti per campagna

La seguente query SQL di esempio analizza il numero di impressioni e utenti distinti per campagna negli ultimi 30 giorni.

# 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

Campagne più recenti ordinate per campagna e data

La seguente query SQL di esempio analizza le campagne più recenti negli ultimi 30 giorni, ordinate per campagna e data.

# 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

Impressioni e utenti distinti per campagna in un intervallo di date

La seguente query SQL di esempio analizza il numero di impressioni e utenti distinti per campagna tra start_date e 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

Impressioni, clic, attività e utenti distinti per campagna

La seguente query SQL di esempio analizza il numero di impressioni, clic, attività e utenti distinti per campagna negli ultimi 30 giorni. In questa query, sostituisci le variabili come campaign_list con i tuoi valori. Ad esempio, sostituisci campaign_list con un elenco separato da virgole di tutte le campagne Campaign Manager di interesse nell'ambito della query.

# 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

Attività di campagna

La seguente query SQL di esempio analizza l'attività della campagna negli ultimi 30 giorni. In questa query, sostituisci le variabili come campaign_list con i tuoi valori. Ad esempio, sostituisci campaign_list con un elenco separato da virgole di tutte le campagne Campaign Manager di interesse nell'ambito della query.

# 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