Transferts Campaign Manager

Le connecteur du service de transfert de données BigQuery pour Campaign Manager vous permet de planifier et de gérer automatiquement les tâches de chargement récurrentes pour les données de rapports Campaign Manager.

Rapports acceptés

Le service de transfert de données BigQuery pour Campaign Manager (anciennement DoubleClick Campaign Manager) est compatible avec les options de création de rapports suivantes:

Pour en savoir plus sur la transformation des rapports Campaign Manager en tables et vues BigQuery, consultez la page Transformation des rapports Campaign Manager.

Option de création de rapports Compatibilité
Fréquence de répétition

Toutes les 8 heures, en fonction de l'heure de création.

Non configurable

Intervalle d'actualisation

Les deux derniers jours

Non configurable

Durée maximale du remplissage

Les 60 derniers jours

Campaign Manager conserve les fichiers de transfert de données pendant 60 jours maximum. Les fichiers datant de plus de 60 jours sont supprimés par Campaign Manager.

Ingestion de données à partir de transferts Campaign Manager

Lorsque vous transférez des données de Campaign Manager vers BigQuery, elles sont chargées dans des tables BigQuery partitionnées par date. La partition de la table dans laquelle les données sont chargées correspond à la date de la source de données. Si vous planifiez plusieurs transferts pour la même date, le service de transfert de données BigQuery remplace la partition de cette date spécifique par les données les plus récentes. Plusieurs transferts le même jour ou l'exécution de remplissages n'entraînent pas de données en double, et les partitions des autres dates ne sont pas affectées.

Actualiser les fenêtres

Un intervalle d'actualisation correspond au nombre de jours pendant lesquels un transfert de données récupère des données lors d'un transfert de données. Par exemple, si la fenêtre d'actualisation est de trois jours et qu'un transfert quotidien a lieu, le service de transfert de données BigQuery récupère toutes les données de votre table source des trois derniers jours. Dans cet exemple, lorsqu'un transfert quotidien a lieu, le service de transfert de données BigQuery crée une partition de table de destination BigQuery avec une copie des données de votre table source du jour, puis déclenche automatiquement des exécutions de remplissage pour mettre à jour les partitions de table de destination BigQuery avec les données de votre table source des deux jours précédents. Les opérations de remplissage déclenchées automatiquement écrasent ou mettent à jour de manière incrémentielle votre table de destination BigQuery, selon que les mises à jour incrémentielles sont ou non compatibles avec le connecteur du service de transfert de données BigQuery.

Lorsque vous exécutez un transfert de données pour la première fois, celui-ci récupère toutes les données sources disponibles pendant l'intervalle d'actualisation. Par exemple, si la fenêtre d'actualisation est de trois jours et que vous exécutez le transfert de données pour la première fois, le service de transfert de données BigQuery récupère toutes les données sources dans un délai de trois jours.

Les fenêtres d'actualisation sont mappées sur le champ d'API TransferConfig.data_refresh_window_days.

Pour récupérer des données en dehors de la période d'actualisation, telles que des données historiques, ou pour récupérer des données en cas d'indisponibilité ou d'écarts de transfert, vous pouvez lancer ou planifier une exécution de remplissage.

Avant de commencer

Avant de créer un transfert de données Campaign Manager :

  • Vérifiez que vous avez effectué toutes les actions requises pour activer le service de transfert de données BigQuery.
  • Créez un ensemble de données BigQuery pour stocker les données Campaign Manager.
  • Assurez-vous que votre organisation a accès aux fichiers de transfert de données v2 de Campaign Manager (Campaign Manager DTv2). Ces fichiers sont transmis par l'équipe Campaign Manager à un bucket Cloud Storage. Pour obtenir l'accès aux fichiers Campaign Manager DTv2, la prochaine étape varie selon que vous avez conclu ou non un contrat direct avec Campaign Manager. Dans un cas comme dans l'autre, des frais supplémentaires peuvent s'appliquer.

    • Si vous avez un contrat avec Campaign Manager, contactez l'assistance Campaign Manager pour configurer les fichiers Campaign Manager DTv2.
    • Si vous n'avez pas de contrat avec Campaign Manager, votre agence ou votre revendeur Campaign Manager peut avoir accès aux fichiers Campaign Manager DTv2. Contactez-les pour accéder à ces fichiers.

    À l'issue de cette étape, vous recevrez un nom de bucket Cloud Storage semblable au suivant :

    dcdt_-dcm_account123456

  • Si vous avez l'intention de configurer des notifications d'exécution de transfert pour Pub/Sub, vous devez disposer des autorisations pubsub.topics.setIamPolicy. Pour plus d'informations, consultez la page Notifications d'exécution du service de transfert de données BigQuery.

Autorisations requises

  • BigQuery : assurez-vous que la personne qui crée le transfert de données dispose des autorisations suivantes dans BigQuery :

    • Autorisations bigquery.transfers.update pour créer le transfert de données
    • Autorisations bigquery.datasets.get et bigquery.datasets.update sur l'ensemble de données cible

    Le rôle IAM prédéfini bigquery.admin inclut les autorisations bigquery.transfers.update, bigquery.datasets.update et bigquery.datasets.get. Pour en savoir plus sur les rôles IAM associés au service de transfert de données BigQuery, consultez la page Contrôle des accès.

  • Campaign Manager : accès en lecture aux fichiers Campaign Manager DTv2 stockés dans Cloud Storage. L'accès est géré par l'entité qui vous a envoyé le bucket Cloud Storage.

Configurer un transfert Campaign Manager

Pour configurer un transfert de données Campaign Manager, vous devez disposer des éléments suivants :

  • Bucket Cloud Storage : URI du bucket Cloud Storage pour les fichiers Campaign Manager DTv2, comme décrit dans la section Avant de commencer. Le nom du bucket doit ressembler à ceci :

    dcdt_-dcm_account123456

  • ID Campaign Manager : votre ID de réseau Campaign Manager, d'annonceur ou votre ID Floodlight. L'ID de réseau est le parent dans la hiérarchie.

Trouver l'ID Campaign Manager

Pour récupérer votre ID Campaign Manager, vous pouvez utiliser la console Cloud Storage afin d'examiner les fichiers figurant dans votre bucket Cloud Storage de transfert de données Campaign Manager. L'ID Campaign Manager permet de mettre en correspondance les fichiers dans le bucket Cloud Storage fourni. L'ID est intégré au nom du fichier, pas au nom du bucket Cloud Storage.

Par exemple :

  • Dans un fichier nommé dcm_account123456_activity_*, l'ID est 123456.
  • Dans un fichier nommé dcm_floodlight7890_activity_*, l'ID est 7890.
  • Dans un fichier nommé dcm_advertiser567_activity_*, l'ID est 567.

Trouver le préfixe du nom de fichier

Dans de rares cas, les fichiers figurant dans votre bucket Cloud Storage peuvent avoir des noms personnalisés non standards, que l'équipe des services Google Marketing Platform a configurés à votre place.

Par exemple :

  • Dans un fichier nommé dcm_account123456custom_activity_*, le préfixe est dcm_account123456custom, soit tout ce qui précède _activity.

Si vous avez besoin d'aide, contactez l'assistance Campaign Manager.

Créer un transfert de données pour Campaign Manager

Console

  1. Accédez à la page "Transferts de données" dans la console Google Cloud.

    Accéder à la page Transferts de données

  2. Cliquez sur Créer un transfert.

  3. Sur la page Créer un transfert :

    • Dans le champ Source de la section Source type (Type de source), choisissez Campaign Manager.

      Source de transfert

    • Dans la section Transfer config name (Nom de la configuration de transfert), sous Display name (Nom à afficher), saisissez un nom pour le transfert de données, tel que My Transfer. Ce nom peut correspondre à toute valeur permettant d'identifier le transfert si vous devez le modifier ultérieurement.

      Nom du transfert

    • Dans la section Schedule options (Options de programmation), pour le champ Custom Schedule (Programmation personnalisée), laissez la valeur par défaut Start now (Commencer), ou cliquez sur Start at a set time (Démarrer à l'heure définie).

      • Pour le champ Repeats (Périodicité), choisissez l'une des options suivantes pour la fréquence d'exécution du transfert.

        • Daily (Tous les jours) (par défaut)
        • Toutes les semaines
        • Tous les mois
        • Personnalisé
        • À la demande

        Si vous choisissez une option autre que Daily (Tous les jours), des options supplémentaires sont disponibles. Par exemple, si vous choisissez Weekly (Toutes les semaines), une option vous permet de sélectionner le jour de la semaine.

      • Pour Start date and run time (Date de début et heure d'exécution), saisissez la date et l'heure de début du transfert de données. Cette option est désactivée si vous choisissez Start now (Commencer maintenant).

        Planning de transfert

    • Dans la section Destination settings (Paramètres de destination), pour le champ Destination dataset (Ensemble de données de destination), choisissez l'ensemble de données que vous avez créé pour stocker vos données.

      Transférer un ensemble de données

    • Dans la section Data source details (Détails de la source de données) :

      • Pour Cloud Storage bucket (Bucket Cloud Storage), saisissez ou recherchez le nom du bucket Cloud Storage qui stocke vos fichiers de transfert de données V.2.0. N'incluez pas gs:// lorsque vous saisissez le nom du bucket.
      • Pour DoubleClick ID (ID DoubleClick), saisissez l'ID Campaign Manager approprié.
      • (Facultatif) Si vos fichiers ont des noms standards comme dans ces exemples, laissez vide le champ File name prefix (Préfixe du nom de fichier). Spécifiez un préfixe de nom de fichier si les fichiers de votre bucket Cloud Storage ont des noms personnalisés.

        Détails de la source Campaign Manager

    • (Facultatif) Dans la section Notification options (Options de notification) :

      • Cliquez sur le bouton pour activer les notifications par e-mail. Lorsque vous activez cette option, l'administrateur de transfert reçoit une notification par e-mail en cas d'échec de l'exécution du transfert.
      • Pour le champ Select a Pub/Sub topic (Sélectionner un sujet Pub/Sub), choisissez le nom de votre sujet ou cliquez sur Create a topic (Créer un sujet). Cette option configure les notifications d'exécution Cloud Pub/Sub pour votre transfert.
  4. Cliquez sur Enregistrer.

bq

Saisissez la commande bq mk, puis spécifiez l'indicateur de création de transfert --transfer_config. Les paramètres suivants sont également requis :

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

Où :

  • project_id est l'ID de votre projet.
  • dataset est l'ensemble de données cible de la configuration de transfert de données.
  • name est le nom à afficher pour la configuration du transfert de données. Ce nom peut correspondre à toute valeur permettant d'identifier le transfert si vous devez le modifier ultérieurement.
  • parameters contient les paramètres de la configuration de transfert de données créée au format JSON. Exemple : --params='{"param":"param_value"}'. Pour Campaign Manager, vous devez fournir les paramètres bucket et network_id. bucket correspond au bucket Cloud Storage contenant vos fichiers Campaign Manager DTv2. network_id correspond à votre ID de réseau, Floodlight ou d'annonceur.
  • data_source correspond à la source de données : dcm_dt (Campaign Manager).

Vous pouvez également indiquer l'option --project_id pour spécifier un projet particulier. Si --project_id n'est pas spécifié, le projet par défaut est utilisé.

Par exemple, la commande suivante crée un transfert de données Campaign Manager nommé My Transfer avec l'ID Campaign Manager 123456, le bucket Cloud Storage dcdt_-dcm_account123456 et l'ensemble de données cible mydataset. Le paramètre file_name_prefix, qui est facultatif, n'est utilisé que pour les noms de fichiers rares et personnalisés.

Le transfert de données est créé dans le projet par défaut :

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

Après avoir exécuté la commande, vous recevez un message de ce type :

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

Suivez les instructions et collez le code d'authentification sur la ligne de commande.

API

Utilisez la méthode projects.locations.transferConfigs.create et fournissez une instance de la ressource TransferConfig.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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

Résoudre les problèmes liés à la configuration d'un transfert Campaign Manager

Si vous rencontrez des problèmes lors de la configuration de votre transfert de données, consultez la section Problèmes de transfert Campaign Manager de la page Résoudre les problèmes de configuration du transfert.

Interroger les données

Lorsque les données sont transférées vers BigQuery, elles sont écrites dans des tables partitionnées avec date d'ingestion. Pour plus d'informations, consultez la page Présentation des tables partitionnées.

Si vous interrogez directement les tables au lieu d'utiliser les vues générées automatiquement, vous devez utiliser la pseudo-colonne _PARTITIONTIME dans votre requête. Pour en savoir plus, consultez la page Interroger des tables partitionnées.

Exemples de requêtes Campaign Manager

Vous pouvez utiliser les exemples de requêtes Campaign Manager suivants pour analyser les données transférées. Vous pouvez également interroger les données dans un outil de visualisation tel que Looker Studio. Ces requêtes sont fournies pour vous guider dans l'interrogation des données Campaign Manager avec BigQuery. Pour en savoir plus sur ce que vous pouvez faire avec ces rapports, contactez votre représentant technique Campaign Manager.

Dans chacune des requêtes suivantes, remplacez les variables comme dataset par vos valeurs.

Dernières campagnes

L'exemple de requête SQL suivant permet de récupérer les dernières campagnes.

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

Impressions et utilisateurs distincts par campagne

L'exemple de requête SQL suivant permet d'analyser le nombre d'impressions et d'utilisateurs distincts par campagne au cours des 30 derniers jours.

# 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

Dernières campagnes triées par campagne et date

L'exemple de requête SQL suivant permet d'analyser les dernières campagnes pour les 30 derniers jours, triées par campagne et par date.

# 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

Impressions et utilisateurs distincts par campagne dans une plage de dates

L'exemple de requête SQL suivant analyse le nombre d'impressions et d'utilisateurs distincts par campagne entre la date de début (start_date) et la date de fin (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

Impressions, clics, activités et utilisateurs distincts par campagne

L'exemple de requête SQL suivant permet d'analyser le nombre d'impressions, de clics, d'activités et d'utilisateurs distincts par campagne au cours des 30 derniers jours. Dans cette requête, remplacez les variables comme campaign_list par vos valeurs. Par exemple, remplacez campaign_list par une liste de toutes les campagnes Campaign Manager qui vous intéressent, séparées par une virgule.

# 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

Activité des campagnes

L'exemple de requête SQL suivant permet d'analyser l'activité des campagnes au cours des 30 derniers jours. Dans cette requête, remplacez les variables comme campaign_list par vos valeurs. Par exemple, remplacez campaign_list par une liste de toutes les campagnes Campaign Manager qui vous intéressent, séparées par une virgule.

# 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