Transferencias de Campaign Manager

El conector BigQuery Data Transfer Service para Campaign Manager te permite programar y gestionar automáticamente tareas de carga periódicas de los datos registrados en Campaign Manager.

Informes admitidos

BigQuery Data Transfer Service para Campaign Manager (antes conocido como DoubleClick Campaign Manager) admite las siguientes opciones de informes:

Para obtener información sobre cómo se transforman los informes de Campaign Manager en tablas y vistas de BigQuery, consulte el artículo Transformación de informes de Campaign Manager.

Opción de denuncia Asistencia
Frecuencia de repetición

Cada 8 horas, según la hora de creación.

No se pueden configurar.

Actualizar ventana

Últimos 2 días

No se pueden configurar.

Duración máxima de relleno

Últimos 60 días

Campaign Manager conserva los archivos de Data Transfer durante un máximo de 60 días. Campaign Manager elimina los archivos con más de 60 días.

Ingestión de datos de transferencias de Campaign Manager

Cuando transfiere datos de Campaign Manager a BigQuery, los datos se cargan en tablas de BigQuery que están particionadas por fecha. La partición de la tabla en la que se cargan los datos corresponde a la fecha de la fuente de datos. Si programa varias transferencias para la misma fecha, BigQuery Data Transfer Service sobrescribirá la partición de esa fecha con los datos más recientes. Si se realizan varias transferencias el mismo día o se ejecutan rellenados, no se duplicarán los datos y no se verán afectadas las particiones de otras fechas.

Actualizar ventanas

Una ventana de actualización es el número de días durante los que una transferencia de datos recupera datos cuando se produce una transferencia de datos. Por ejemplo, si la ventana de actualización es de tres días y se produce una transferencia diaria, BigQuery Data Transfer Service recupera todos los datos de la tabla de origen de los últimos tres días. En este ejemplo, cuando se produce una transferencia diaria, BigQuery Data Transfer Service crea una partición de tabla de destino de BigQuery con una copia de los datos de la tabla de origen del día actual y, a continuación, activa automáticamente ejecuciones de relleno para actualizar las particiones de tabla de destino de BigQuery con los datos de la tabla de origen de los dos días anteriores. Las ejecuciones de relleno automático sobrescribirán o actualizarán de forma incremental tu tabla de destino de BigQuery, en función de si el conector de BigQuery Data Transfer Service admite o no las actualizaciones incrementales.

Cuando ejecutas una transferencia de datos por primera vez, esta recupera todos los datos de origen disponibles en la ventana de actualización. Por ejemplo, si la ventana de actualización es de tres días y ejecutas la transferencia de datos por primera vez, BigQuery Data Transfer Service recuperará todos los datos de origen en un plazo de tres días.

Los periodos de actualización se asignan al campo de la API TransferConfig.data_refresh_window_days.

Para recuperar datos que no estén dentro del periodo de actualización (por ejemplo, datos históricos) o para recuperar datos de interrupciones o brechas en la transferencia, puedes iniciar o programar una reposición.

Antes de empezar

Antes de crear una transferencia de datos de Campaign Manager, debe hacer lo siguiente:

  • Comprueba que has completado todas las acciones necesarias para habilitar BigQuery Data Transfer Service.
  • Crea un conjunto de datos de BigQuery para almacenar los datos de Campaign Manager.
  • Asegúrate de que tu organización tiene acceso a los archivos de la versión 2 de Data Transfer de Campaign Manager (DTv2 de Campaign Manager). El equipo de Campaign Manager entrega estos archivos en un segmento de Cloud Storage. Para obtener acceso a los archivos de DTv2 de Campaign Manager, el siguiente paso depende de si tiene un contrato directo con Campaign Manager. En ambos casos, podrían aplicarse cargos adicionales.

    • Si tiene un contrato con Campaign Manager, póngase en contacto con el equipo de Asistencia de Campaign Manager para configurar los archivos DTv2 de Campaign Manager.
    • Si no tiene un contrato con Campaign Manager, es posible que su agencia o su distribuidor de Campaign Manager tengan acceso a los archivos de DTv2 de Campaign Manager. Ponte en contacto con tu agencia o distribuidor para acceder a estos archivos.

    Una vez completado este paso, recibirás un nombre de segmento de Cloud Storage similar al siguiente:

    dcdt_-dcm_account123456

  • Si quieres configurar notificaciones de ejecuciones de transferencias para Pub/Sub, debes tener permisos de pubsub.topics.setIamPolicy. Para obtener más información, consulta el artículo sobre las notificaciones de ejecución de BigQuery Data Transfer Service.

Permisos obligatorios

  • BigQuery asegúrate de que la persona que crea la transferencia de datos tenga los siguientes permisos en BigQuery:

    • Permisos de bigquery.transfers.update para crear la transferencia de datos
    • Permisos bigquery.datasets.get y bigquery.datasets.update en el conjunto de datos de destino

    El rol predefinido de gestión de identidades y accesos bigquery.admin incluye los permisos bigquery.transfers.update, bigquery.datasets.update y bigquery.datasets.get. Para obtener más información sobre los roles de gestión de identidades y accesos en BigQuery Data Transfer Service, consulta Control de acceso.

  • Campaign Manager: acceso de lectura a los archivos de DTv2 de Campaign Manager almacenados en Cloud Storage. El acceso lo gestiona la entidad desde la que recibiste el segmento de Cloud Storage.

Configurar una transferencia de Campaign Manager

Para configurar una transferencia de datos de Campaign Manager, se necesita lo siguiente:

  • Segmento de Cloud Storage: el URI del segmento de Cloud Storage de tus archivos DTv2 de Campaign Manager, tal como se describe en la sección Antes de empezar. El nombre del segmento debe tener el siguiente formato:

    dcdt_-dcm_account123456

  • ID de Campaign Manager: su ID de red, anunciante o Floodlight de Campaign Manager. El ID de red es el elemento principal de la jerarquía.

Buscar tu ID de Campaign Manager

Para obtener tu ID de Campaign Manager, puedes usar la consola de Cloud Storage para examinar los archivos de tu segmento de Cloud Storage de Transferencia de Datos de Campaign Manager. El ID de Campaign Manager se usa para asociar archivos en el segmento de Cloud Storage proporcionado. El ID está insertado en el nombre del archivo, no en el nombre del segmento de Cloud Storage.

Por ejemplo:

  • En un archivo llamado dcm_account123456_activity_*, el ID es 123456.
  • En un archivo llamado dcm_floodlight7890_activity_*, el ID es 7890.
  • En un archivo llamado dcm_advertiser567_activity_*, el ID es 567.

Buscar el prefijo del nombre de archivo

En raras ocasiones, los archivos de tu segmento de Cloud Storage pueden tener nombres de archivo personalizados y no estándar que haya configurado el equipo de servicios de Google Marketing Platform.

Por ejemplo:

  • En un archivo llamado dcm_account123456custom_activity_*, el prefijo es dcm_account123456custom, es decir, todo lo que hay antes de _activity.

Si necesitas ayuda, ponte en contacto con el equipo de Asistencia de Campaign Manager.

Crear una transferencia de datos para Campaign Manager

Consola

  1. Ve a la página Transferencias de datos de la Google Cloud consola.

    Ir a Transferencias de datos

  2. Haz clic en Crear transferencia.

  3. En la página Crear transferencia, haz lo siguiente:

    • En la sección Tipo de fuente, en Fuente, elija Campaign Manager.

      Fuente de transferencia

    • En la sección Nombre de la configuración de transferencia, en Nombre visible, indica un nombre para la transferencia de datos; por ejemplo, My Transfer. El nombre de la transferencia puede ser cualquier valor que te permita identificarla si necesitas modificarla más adelante.

      Nombre de transferencia

    • En la sección Opciones de programación, en Programación, deja el valor predeterminado (Empezar ahora) o haz clic en Empezar a una hora determinada.

      • En Se repite, elige una opción para determinar la frecuencia con la que se ejecutará la transferencia. Si eliges una opción que no sea Diario, tendrás otras opciones disponibles. Por ejemplo, si elige Semanalmente, aparecerá una opción para seleccionar el día de la semana.
      • En Fecha de inicio y tiempo de ejecución, introduce la fecha y la hora en las que quieres que empiece la transferencia de datos. Si eliges Empezar ahora, esta opción estará inhabilitada.
    • En la sección Configuración de destino, en Conjunto de datos de destino, selecciona el conjunto de datos que has creado para almacenar los datos.

      Transferir conjunto de datos

    • En la sección Detalles de la fuente de datos:

      • En Segmento de Cloud Storage, introduce o busca el nombre del segmento de Cloud Storage que almacena tus archivos de Transferencia de datos V2.0. Cuando introduzcas el nombre del segmento, no incluyas gs://.
      • En ID de DoubleClick, introduzca el ID de Campaign Manager correspondiente.
      • (Opcional) Si tus archivos tienen nombres estándar como estos ejemplos, deja en blanco el campo Prefijo de nombre de archivo. Especifica un prefijo de nombre de archivo si los archivos de tu segmento de Cloud Storage tienen nombres de archivo personalizados.

      Detalles de la fuente de Campaign Manager

    • (Opcional) En la sección Opciones de notificación:

      • Haz clic en el interruptor para habilitar las notificaciones por correo electrónico. Si habilitas esta opción, el administrador de las transferencias recibirá una notificación por correo cuando falle una ejecución de transferencia.
      • En Selecciona un tema de Pub/Sub, elige el tema o haz clic en Crear un tema. Esta opción configura las notificaciones de Pub/Sub sobre la transferencia.
  4. Haz clic en Guardar.

bq

Introduce el comando bq mk y proporciona la marca de creación de transferencia — --transfer_config. También se necesitan las siguientes marcas:

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

Donde:

  • project_id es el ID del proyecto.
  • dataset es el conjunto de datos de destino de la configuración de Data Transfer.
  • name es el nombre visible de la configuración de transferencia de datos. El nombre de la transferencia puede ser cualquier valor que te permita identificarla si necesitas modificarla más adelante.
  • parameters contiene los parámetros de la configuración de transferencia de datos creada en formato JSON. Por ejemplo: --params='{"param":"param_value"}'. En el caso de Campaign Manager, debe proporcionar los parámetros bucket y network_id. bucket es el segmento de Cloud Storage que contiene tus archivos de DTv2 de Campaign Manager. network_id es su ID de red, de Floodlight o de anunciante.
  • data_source es la fuente de datos: dcm_dt (Gestor de Campañas).

También puedes usar la marca --project_id para especificar un proyecto concreto. Si no se especifica --project_id, se usa el proyecto predeterminado.

Por ejemplo, el siguiente comando crea una transferencia de datos de Campaign Manager llamada My Transfer con el ID de Campaign Manager 123456, el segmento de Cloud Storage dcdt_-dcm_account123456 y el conjunto de datos de destino mydataset. El parámetro file_name_prefix es opcional y solo se usa para nombres de archivo personalizados poco frecuentes.

La transferencia de datos se crea en el proyecto predeterminado:

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

Después de ejecutar el comando, recibirás un mensaje como el siguiente:

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

Sigue las instrucciones y pega el código de autenticación en la línea de comandos.

API

Usa el método projects.locations.transferConfigs.create y proporciona una instancia del recurso TransferConfig.

Java

Antes de probar este ejemplo, sigue las Javainstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Solucionar problemas de configuración de transferencias de Campaign Manager

Si tienes problemas para configurar la transferencia de datos, consulta la sección Problemas con la transferencia de Campaign Manager del artículo Solucionar problemas con las configuraciones de transferencia.

Consultar tus datos

Cuando tus datos se transfieren a BigQuery, se escriben en tablas con particiones por hora de ingestión. Para obtener más información, consulta el artículo Introducción a las tablas particionadas.

Si consultas tus tablas directamente en lugar de usar las vistas generadas automáticamente, debes usar la pseudocolumna _PARTITIONTIME en tu consulta. Para obtener más información, consulta Consultar tablas con particiones.

Consultas de ejemplo de Campaign Manager

Puede usar las siguientes consultas de ejemplo de Campaign Manager para analizar los datos transferidos. También puedes usar las consultas en una herramienta de visualización, como Looker Studio. Estas consultas se proporcionan para ayudarte a empezar a consultar tus datos de Campaign Manager con BigQuery. Si tiene alguna pregunta más sobre lo que puede hacer con estos informes, póngase en contacto con su representante técnico de Campaign Manager.

En cada una de las siguientes consultas, sustituya las variables, como dataset, por sus valores.

Últimas campañas

La siguiente consulta de ejemplo en SQL obtiene las campañas más recientes.

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

Impresiones y usuarios únicos por campaña

La siguiente consulta de ejemplo de SQL analiza el número de impresiones y usuarios únicos por campaña en los últimos 30 días.

# 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

Últimas campañas ordenadas por campaña y fecha

La siguiente consulta SQL de ejemplo analiza las últimas campañas de los últimos 30 días, ordenadas por campaña y fecha.

# 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

Impresiones y usuarios únicos por campaña en un periodo

La siguiente consulta de ejemplo de SQL analiza el número de impresiones y de usuarios únicos por campaña entre el start_date y el 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

Impresiones, clics, actividades y usuarios únicos por campaña

La siguiente consulta SQL de ejemplo analiza el número de impresiones, clics, actividades y usuarios únicos por campaña en los últimos 30 días. En esta consulta, sustituye las variables, como campaign_list, por tus valores. Por ejemplo, sustituya campaign_list por una lista separada por comas de todas las campañas de Campaign Manager que le interesen en el ámbito de la consulta.

# 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

Actividad de la campaña

La siguiente consulta de ejemplo de SQL analiza la actividad de las campañas de los últimos 30 días. En esta consulta, sustituya las variables, como campaign_list, por sus valores. Por ejemplo, sustituya campaign_list por una lista separada por comas de todas las campañas de Campaign Manager que le interesen en el ámbito de la consulta.

# 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