Mindbox
Как периодически обновлять данные

Как получить внешний ID клиента в аналитических экспортах

В аналитических экспортах все данные привязаны к внутреннему идентификатору клиента mindboxId. Чтобы использовать в аналитике на своей стороне внешний идентификатор (externalId), свяжите mindboxId с externalId и присоедините результат к нужным аналитическим таблицам.

Перед началом

Убедитесь, что у вас есть:

  • настроенная интеграция «Данные для аналитики» и доступ к аналитическим экспортам (delta-sharing);
  • ключ шифрования — находится в разделе Интеграции → Точка интеграции «Данные для аналитики» → Ключ шифрования.

Шаг 1. Выберите тип идентификатора

Внешние идентификаторы — это дополнительные поля с типом TechnicalIdentity или SocialNetworkIdentity. Список типов и их internalId доступны в таблице справочника дополнительных полей:

Code
SELECT internalId, systemName, name, typeSystemName FROM CustomFieldKinds WHERE typeSystemName IN ('TechnicalIdentity', 'SocialNetworkIdentity');

Выберите нужный тип и запомните его internalId — это значение для фильтра customfieldKindInternalId в следующих шагах. Определить нужный тип можно по полям systemName или name, проверив их в интерфейсе Mindbox.

Шаг 2. Получите актуальную связку mindboxId → externalId

Таблица exports.CDP.ExternalCustomerIdsHistory хранит версии изменений внешних идентификаторов клиентов. Чтобы получить актуальное состояние, возьмите последнюю версию каждой записи и отбросьте удаленные:

Code
SELECT * FROM ( SELECT * FROM ExternalCustomerIdsHistory ORDER BY _database_version DESC LIMIT 1 BY id, customfieldKindInternalId ) WHERE _isDeleted = false AND customfieldKindInternalId = <нужный_internalId>;

В результате:

  • unmergedCustomerId — mindboxId клиента;
  • value — внешний идентификатор клиента (зашифрован, расшифровка — в шаге 4).

customfieldKindInternalId — это тип идентификатора (ссылка на дополнительное поле), а не идентификатор клиента. Идентификатор клиента — unmergedCustomerId, внешний идентификатор — value.

Шаг 3. Учтите объединение клиентов

В Mindbox клиенты с одинаковыми контактными данными могут объединяться. После объединения в истории остаются записи по всем исходным клиентам (каждая со своим value), но с одним итоговым unmergedCustomerId. Из-за этого на один mindboxId может приходиться несколько значений value.

Для корректной связки:

Если нужен ровно один последний внешний ID на клиента, после среза по версии возьмите последнюю запись по дате создания исходного слепка:

Code
SELECT * FROM ( SELECT * FROM ExternalCustomerIdsHistory ORDER BY _database_version DESC LIMIT 1 BY id, customfieldKindInternalId ) WHERE _isDeleted = false AND customfieldKindInternalId = <нужный_internalId> ORDER BY historicalCustomerCreationDateTimeUtc DESC LIMIT 1 BY unmergedCustomerId;

Количество уникальных unmergedCustomerId и уникальных value может не совпадать — это нормальное поведение при объединении клиентов.

Шаг 4. Расшифруйте значение value

Значение внешнего идентификатора в поле value зашифровано. Для расшифровки используйте ключ шифрования из интерфейса Mindbox: Интеграции → Точка интеграции «Данные для аналитики» → Ключ шифрования.

Алгоритм и готовый пример на Python описаны в разделе «Зашифрованные данные».

Пример: внешний ID рядом со статусом рассылки

Задача: к каждой записи статуса рассылки добавить внешний идентификатор клиента.

Логика запроса:

Code
SELECT sendings.messageId, sendings.messageStatusId, sendings.mailingStatusSystemName, sendings.dateTimeUTC, sendings.unmergedCustomerId, merged.mergedCustomerId, sendings.mailingInternalId, sendings.mailingVariantNum, sendings.mailingLink, sendings.mailingSourceEntityType, sendings.mailingSourceEntityId, sendings.notSentSystemName, sendings.notDeliveredReasonSystemName, ext_ids.customfieldKindInternalId, ext_ids.value AS externalCustomerId FROM ( -- Статусы рассылок (без удаленных) SELECT * FROM CustomerMessagesStatuses WHERE (empty(_isDeleted) OR _isDeleted = false) ) AS sendings -- Объединения клиентов: приведение к актуальному mergedCustomerId LEFT JOIN ( SELECT * FROM ( SELECT * FROM MergedCustomers ORDER BY _rowversion_ts DESC LIMIT 1 BY unmergedCustomerId, mergedCustomerId ) WHERE (empty(_isDeleted) OR _isDeleted = false) ) AS merged ON sendings.unmergedCustomerId = merged.unmergedCustomerId -- Внешние идентификаторы по актуальному ID клиента LEFT JOIN ( SELECT * FROM ( SELECT * FROM ExternalCustomerIdsHistory ORDER BY _database_version DESC LIMIT 1 BY id, customfieldKindInternalId ) WHERE _isDeleted = false AND customfieldKindInternalId = <нужный_internalId> ORDER BY historicalCustomerCreationDateTimeUtc DESC LIMIT 1 BY unmergedCustomerId, customfieldKindInternalId ) AS ext_ids ON ext_ids.unmergedCustomerId = coalesce(merged.mergedCustomerId, sendings.unmergedCustomerId);

Пример построен на сырых данных аналитических экспортов (прямое чтение таблиц delta-sharing). Если на вашей стороне есть промежуточные преобразования перед записью в DWH, адаптируйте запрос под вашу модель данных. Описания полей и типов всех таблиц — в "Описании схемы данных".

Связанные материалы

Last modified on