---
metadata:
  - name: generator
    content: Diplodoc Platform v5.64.0
alternate:
  - https://yandex.com.tr/support/metrica/ru/pro/logs-api-migration.md
  - href: https://yandex.com.tr/support/metrica/ru/pro/logs-api-migration.md
    type: text/markdown
    title: Markdown version
  - href: https://yandex.com.tr/support/metrica/ru/llms.txt?revision=r21848317
    rel: describedby
title: Переход с Logs API на Data Streaming
description: Таблица соответствий полей Logs API и Data Streaming, формулы для вычисляемых полей, работа с атрибуцией и гео-данными.
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.com.tr/support/metrica/ru/llms.txt?revision=r21848317


# Переход с Logs API на Data Streaming

{% note info %}

Функция доступна только для пакета Метрика Про.

{% endnote %}

При переходе с [Logs API](https://yandex.ru/dev/metrika/doc/api2/logs/intro.html) на [Data Streaming](https://yandex.com.tr/support/metrica/ru/uploading-data/cloud.md) (интеграция с Yandex Cloud) данные передаются в кластер ClickHouse. Формат данных Data Streaming не является обратно совместимым с Logs API: названия полей отличаются, а для некоторых полей Logs API нет прямого аналога.

В отличие от Logs API, данные Data Streaming содержат изменения визитов и хитов по версиям. Одна строка в логе — это одна версия визита или хита (события). Поэтому для одного визита или хита в логе может быть несколько строк. Как получить только финальную версию визита или хита, см. на странице [Как работать с данными](https://yandex.com.tr/support/metrica/ru/pro/data-work.md#visits). Чтобы автоматически удалять устаревшие версии данных, в ClickHouse есть специальные механизмы, например [CollapsingMergeTree](https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/collapsingmergetree).

## Как перейти с Logs API на Data Streaming {#how-to-migrate}

1. [Создайте кластер ClickHouse](https://cloud.yandex.ru/docs/managed-clickhouse/operations/cluster-create) в Yandex Cloud, если он еще не создан.
1. [Настройте Data Streaming](https://yandex.com.tr/support/metrica/ru/uploading-data/cloud.md#quick-start): подключите источник данных (Метрика), выберите тип данных (хиты или визиты) и нужные поля, создайте трансфер. Включите потоковую передачу (тип трансфера **Репликация**), чтобы новые данные начали поступать в реальном времени.
1. Сопоставьте поля в SQL-запросах и витринах данных с помощью [таблиц соответствий](#hits-mapping) на этой странице.
1. Для полей Logs API, у которых нет прямого аналога в Data Streaming, используйте [формулы для вычисляемых полей](#formulas).
1. Проверьте корректность данных в кластере ClickHouse, сравнив результаты запросов с данными из Logs API за пересекающийся период.
1. После проверки переключите дашборды, отчеты и интеграции на чтение из ClickHouse и отключите выгрузку через Logs API.

Чтобы заполнить кластер архивными данными в том же формате, что и при потоковой передаче, запустите историческую выгрузку данных за нужный период (тип трансфера **Копирование**). В историческую выгрузку попадают данные, собранные более недели назад: например, за 17 августа данные будут доступны не раньше 10 августа.

{% note info %}

Data Streaming и Logs API можно использовать параллельно в течение переходного периода: данные будут поступать в оба источника. Это позволит сравнить результаты и убедиться в корректности миграции.

{% endnote %}

Чтобы облегчить миграцию и сохранить целостность витрин данных, на этой странице приведены:

- [Таблица соответствий полей хитов](#hits-mapping);
- [Таблица соответствий полей визитов](#visits-mapping);
- [Формулы для вычисляемых полей](#formulas);
- [Особенности работы с атрибуцией](#attribution);
- [Особенности работы с гео-данными](#geo);
- [Данные электронной коммерции](#ecommerce).

## Таблица соответствий полей хитов {#hits-mapping}

В таблице приведены поля хитов (событий) Logs API и их аналоги в Data Streaming.

{% note info %}

Поля, для которых нет прямого аналога, помечены как «Вычисляемое поле» — см. раздел [Формулы для вычисляемых полей](#formulas). Поля, связанные с атрибуцией и гео-данными, описаны в отдельных разделах: [Атрибуция](#attribution) и [Гео-данные](#geo).

{% endnote %}

#|
||**Поле Logs API**|**Поле Data Streaming**|**Примечание**||
||`ym:pv:watchID`|`WatchID`||
||`ym:pv:counterID`|`CounterID`||
||`ym:pv:clientID`|`FirstPartyCookie`||
||`ym:pv:date`|`EventDate`||
||`ym:pv:dateTime`|Дата и время в формате UTC||
||`ym:pv:title`|`Title`||
||`ym:pv:pageCharset`|`PageCharset`||
||`ym:pv:goalsID`|`GoalsReached`|Идентификаторы достигнутых целей, включая офлайн-конверсии (доступны с 12 августа 2025 года)||
||`ym:pv:URL`|`URL`||
||`ym:pv:referer`|`Referer`||
||`ym:pv:UTMCampaign`|`UTMCampaign`||
||`ym:pv:UTMContent`|`UTMContent`||
||`ym:pv:UTMMedium`|`UTMMedium`||
||`ym:pv:UTMSource`|`UTMSource`||
||`ym:pv:UTMTerm`|`UTMTerm`||
||`ym:pv:openstatAd`|`OpenstatAdID`||
||`ym:pv:openstatCampaign`|`OpenstatCampaignID`||
||`ym:pv:openstatService`|`OpenstatServiceName`||
||`ym:pv:openstatSource`|`OpenstatSourceID`||
||`ym:pv:operatingSystem`|`OSStr`, `OS`|Строковый и числовой идентификатор ОС||
||`ym:pv:from`|`FromTag`||
||`ym:pv:hasGCLID`|`HasGCLID`||
||`ym:pv:GCLID`|`GCLID`||
||`ym:pv:lastTrafficSource`|—|См. раздел [Атрибуция](#attribution)||
||`ym:pv:lastSearchEngineRoot`|`SearchEngineRootID`, `SearchEngineRootStrID`|См. раздел [Атрибуция](#attribution)||
||`ym:pv:lastSearchEngine`|—|См. раздел [Атрибуция](#attribution)||
||`ym:pv:lastAdvEngine`|`AdvEngine`, `AdvEngineStrID`|См. раздел [Атрибуция](#attribution)||
||`ym:pv:lastSocialNetwork`|`SocialSourceNetworkID`, `SocialSourceNetworkStrID`|См. раздел [Атрибуция](#attribution)||
||`ym:pv:lastSocialNetworkProfile`|`SocialSourcePage`|См. раздел [Атрибуция](#attribution)||
||`ym:pv:browser`|`UserAgentStr`|Строковый идентификатор браузера||
||`ym:pv:browserMajorVersion`|`UserAgentMajor`|Старшая цифра версии браузера||
||`ym:pv:browserMinorVersion`|`UserAgentMinor`|Младшая цифра версии браузера||
||`ym:pv:browserCountry`|`BrowserCountry`||
||`ym:pv:browserEngine`|`BrowserEngineID`||
||`ym:pv:browserEngineVersion1`|`BrowserEngineVersion1`||
||`ym:pv:browserEngineVersion2`|`BrowserEngineVersion2`||
||`ym:pv:browserEngineVersion3`|`BrowserEngineVersion3`||
||`ym:pv:browserEngineVersion4`|`BrowserEngineVersion4`||
||`ym:pv:browserLanguage`|`BrowserLanguage`||
||`ym:pv:clientTimeZone`|`ClientTimeZone`||
||`ym:pv:cookieEnabled`|`CookieEnable`||
||`ym:pv:deviceCategory`|`IsMobile`, `IsTablet`, `IsTV`|1 — если хит совершен с соответствующего устройства||
||`ym:pv:javascriptEnabled`|`JavascriptEnable`||
||`ym:pv:mobilePhone`|`MobilePhoneVendor`||
||`ym:pv:mobilePhoneModel`|`MobilePhoneModel`||
||`ym:pv:operatingSystemRoot`|`OSRoot`, `OSRootStr`|Числовой и строковый идентификатор группы ОС||
||`ym:pv:physicalScreenHeight`|—|Вычисляемое поле, см. [Формулы](#formula-physcreenheight)||
||`ym:pv:physicalScreenWidth`|—|Вычисляемое поле, см. [Формулы](#formula-physcreenwidth)||
||`ym:pv:screenColors`|`ResolutionDepth`||
||`ym:pv:screenFormat`|—|Вычисляемое поле, см. [Формулы](#formula-screenformat)||
||`ym:pv:screenHeight`|`ResolutionHeight`||
||`ym:pv:screenOrientation`|—|Вычисляемое поле, см. [Формулы](#formula-screenorientation)||
||`ym:pv:screenWidth`|`ResolutionWidth`||
||`ym:pv:windowClientHeight`|`WindowClientHeight`||
||`ym:pv:windowClientWidth`|`WindowClientWidth`||
||`ym:pv:ipAddress`|`ClientIP`, `ClientIP6`|IPv4 или IPv6, с которого установлено TCP-соединение||
||`ym:pv:regionCity`|—|См. раздел [Гео-данные](#geo)||
||`ym:pv:regionCountry`|—|См. раздел [Гео-данные](#geo)||
||`ym:pv:regionCityID`|—|См. раздел [Гео-данные](#geo)||
||`ym:pv:regionCountryID`|—|См. раздел [Гео-данные](#geo)||
||`ym:pv:isPageView`|`IsPageView`||
||`ym:pv:iFrame`|`IsIFrame`||
||`ym:pv:link`|`IsLink`||
||`ym:pv:download`|`IsDownload`||
||`ym:pv:notBounce`|`IsNotBounce`||
||`ym:pv:artificial`|`IsArtifical`||
||`ym:pv:parsedParamsKey1`|`ParsedParams.Key1`||
||`ym:pv:parsedParamsKey2`|`ParsedParams.Key2`||
||`ym:pv:parsedParamsKey3`|`ParsedParams.Key3`||
||`ym:pv:parsedParamsKey4`|`ParsedParams.Key4`||
||`ym:pv:parsedParamsKey5`|`ParsedParams.Key5`||
||`ym:pv:parsedParamsKey6`|`ParsedParams.Key6`||
||`ym:pv:parsedParamsKey7`|`ParsedParams.Key7`||
||`ym:pv:parsedParamsKey8`|`ParsedParams.Key8`||
||`ym:pv:parsedParamsKey9`|`ParsedParams.Key9`||
||`ym:pv:parsedParamsKey10`|`ParsedParams.Key10`||
||`ym:pv:httpError`|`HTTPError`||
||`ym:pv:networkType`|`NetworkType`||
||`ym:pv:shareService`|`ShareService`||
||`ym:pv:shareURL`|`ShareURL`||
||`ym:pv:shareTitle`|`ShareTitle`||
|#

## Таблица соответствий полей визитов {#visits-mapping}

В таблице приведены поля визитов Logs API и их аналоги в Data Streaming.

#|
||**Поле Logs API**|**Поле Data Streaming**|**Примечание**||
||`ym:s:visitID`|`VisitID`||
||`ym:s:counterID`|`CounterID`||
||`ym:s:watchIDs`|`WatchIDs`||
||`ym:s:date`|`StartDate`||
||`ym:s:dateTime`|—|Приведите `UTCStartTime` к нужной таймзоне||
||`ym:s:dateTimeUTC`|`UTCStartTime`||
||`ym:s:isNewUser`|—|Вычисляемое поле, см. [Формулы](#formula-isnewuser)||
||`ym:s:startURL`|`StartURL`||
||`ym:s:endURL`|`EndURL`||
||`ym:s:pageViews`|`PageViews`||
||`ym:s:visitDuration`|`Duration`|Длительность визита в секундах||
||`ym:s:bounce`|`IsBounce`||
||`ym:s:ipAddress`|`ClientIP`, `ClientIP6`||
||`ym:s:regionCountry`|—|См. раздел [Гео-данные](#geo)||
||`ym:s:regionCity`|—|См. раздел [Гео-данные](#geo)||
||`ym:s:regionCountryID`|—|См. раздел [Гео-данные](#geo)||
||`ym:s:regionCityID`|—|См. раздел [Гео-данные](#geo)||
||`ym:s:clientID`|`ClientID`, `FirstPartyCookie`|`ClientID` — доменная кука и значение, отправленное через Measurement Protocol; `FirstPartyCookie` — отдельно||
||`ym:s:networkType`|`NetworkType`||
||`ym:s:goalsID`|`Goals.ID`||
||`ym:s:goalsSerialNumber`|`Goals.Serial`||
||`ym:s:goalsDateTime`|`Goals.EventTime`||
||`ym:s:goalsPrice`|`Goals.Price`||
||`ym:s:goalsOrder`|`Goals.OrderID`||
||`ym:s:goalsCurrency`|`Goals.CurrencyID`||
||`ym:s:lastTrafficSource`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:lastAdvEngine`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:lastReferalSource`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:lastSearchEngineRoot`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:lastSearchEngine`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:lastSocialNetwork`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:lastSocialNetworkProfile`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:referer`|`Referer`||
||`ym:s:lastDirectClickOrder`|`TrafficSource.ClickDirectCampaignID`|Идентификатор кампании в Директе||
||`ym:s:lastDirectBannerGroup`|`TrafficSource.ClickGroupBannerID`|Идентификатор группы объявлений Директа||
||`ym:s:lastDirectClickBanner`|`TrafficSource.ClickBannerID`|Идентификатор рекламного объявления||
||`ym:s:lastDirectClickOrderName`|—|Нет прямого аналога. Есть `TrafficSource.DirectCLID` — идентификатор рекламного клика Директа (YCLID)||
||`ym:s:lastClickBannerGroupName`|—|Нет прямого аналога. Есть `TrafficSource.DirectCLID`||
||`ym:s:lastDirectClickBannerName`|—|Нет прямого аналога. Есть `TrafficSource.DirectCLID`||
||`ym:s:lastDirectPhraseOrCond`|—|Нет прямого аналога. Есть `TrafficSource.DirectCLID`||
||`ym:s:lastDirectPlatformType`|—|Нет прямого аналога. Есть `TrafficSource.DirectCLID`||
||`ym:s:lastDirectPlatform`|`TrafficSource.ClickTargetType`|Площадка размещения||
||`ym:s:lastDirectConditionType`|—|Нет прямого аналога. Есть `TrafficSource.DirectCLID`||
||`ym:s:lastCurrencyID`|`Goals.CurrencyID`, `EPurchase.CurrencyID`||
||`ym:s:from`|`TrafficSource.FromTag`||
||`ym:s:UTMCampaign`|`TrafficSource.UTMCampaign`||
||`ym:s:UTMContent`|`TrafficSource.UTMContent`||
||`ym:s:UTMMedium`|`TrafficSource.UTMMedium`||
||`ym:s:UTMSource`|`TrafficSource.UTMSource`||
||`ym:s:UTMTerm`|`TrafficSource.UTMTerm`||
||`ym:s:openstatAd`|`TrafficSource.OpenstatAdID`||
||`ym:s:openstatCampaign`|`TrafficSource.OpenstatCampaignID`||
||`ym:s:openstatService`|`TrafficSource.OpenstatServiceName`||
||`ym:s:openstatSource`|`TrafficSource.OpenstatSourceID`||
||`ym:s:hasGCLID`|`TrafficSource.HasGCLID`||
||`ym:s:lastGCLID`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:firstGCLID`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:lastSignificantGCLID`|—|См. раздел [Атрибуция](#attribution)||
||`ym:s:browserLanguage`|`BrowserLanguage`||
||`ym:s:browserCountry`|`BrowserCountry`||
||`ym:s:clientTimeZone`|`ClientTimeZone`||
||`ym:s:deviceCategory`|`IsMobile`, `IsTablet`, `IsTV`||
||`ym:s:mobilePhone`|`MobilePhoneVendor`||
||`ym:s:mobilePhoneModel`|`MobilePhoneModel`||
||`ym:s:operatingSystemRoot`|`OSRoot`, `OSRootStr`||
||`ym:s:operatingSystem`|`OSStr`, `OS`||
||`ym:s:browser`|`UserAgentStr`||
||`ym:s:browserMajorVersion`|`UserAgentMajor`||
||`ym:s:browserMinorVersion`|`UserAgentMinor`||
||`ym:s:browserEngine`|`BrowserEngineID`||
||`ym:s:browserEngineVersion1`|`BrowserEngineVersion1`||
||`ym:s:browserEngineVersion2`|`BrowserEngineVersion2`||
||`ym:s:browserEngineVersion3`|`BrowserEngineVersion3`||
||`ym:s:browserEngineVersion4`|`BrowserEngineVersion4`||
||`ym:s:cookieEnabled`|`CookieEnable`||
||`ym:s:javascriptEnabled`|`JavascriptEnable`||
||`ym:s:screenFormat`|—|Вычисляемое поле, см. [Формулы](#formula-screenformat)||
||`ym:s:screenColors`|`ResolutionDepth`||
||`ym:s:screenOrientation`|—|Вычисляемое поле, см. [Формулы](#formula-screenorientation)||
||`ym:s:screenWidth`|`ResolutionWidth`||
||`ym:s:screenHeight`|`ResolutionHeight`||
||`ym:s:physicalScreenWidth`|—|Вычисляемое поле, см. [Формулы](#formula-physcreenwidth)||
||`ym:s:physicalScreenHeight`|—|Вычисляемое поле, см. [Формулы](#formula-physcreenheight)||
||`ym:s:windowClientWidth`|`WindowClientWidth`||
||`ym:s:windowClientHeight`|`WindowClientHeight`||
||`ym:s:purchaseID`|`EPurchase.ID`||
||`ym:s:purchaseDateTime`|`EPurchase.EventTime`||
||`ym:s:purchaseAffiliation`|`EPurchase.Affiliation`||
||`ym:s:purchaseRevenue`|`EPurchase.Revenue`||
||`ym:s:purchaseTax`|`EPurchase.Tax`||
||`ym:s:purchaseShipping`|`EPurchase.Shipping`||
||`ym:s:purchaseCoupon`|`EPurchase.Coupon`||
||`ym:s:purchaseCurrency`|`EPurchase.Currency`||
||`ym:s:purchaseProductQuantity`|`EPurchase.ProductQuantity`||
||`ym:s:productsPurchaseID`|`EPurchaseWithProducts.ID`||
||`ym:s:productsID`|`EAction.ProductID`||
||`ym:s:productsName`|`EAction.ProductName`||
||`ym:s:productsBrand`|`EAction.ProductBrand`||
||`ym:s:productsCategory`|`EAction.ProductCategory`||
||`ym:s:productsCategory1`|`EAction.ProductCategory1`||
||`ym:s:productsCategory2`|`EAction.ProductCategory2`||
||`ym:s:productsCategory3`|`EAction.ProductCategory3`||
||`ym:s:productsCategory4`|`EAction.ProductCategory4`||
||`ym:s:productsCategory5`|`EAction.ProductCategory5`||
||`ym:s:productsVariant`|`EAction.ProductVariant`||
||`ym:s:productsPosition`|`EAction.ProductPosition`||
||`ym:s:productsPrice`|`EAction.ProductPrice`||
||`ym:s:productsCurrency`|`EAction.ProductCurrency`||
||`ym:s:productsCoupon`|`EAction.ProductCoupon`||
||`ym:s:productsQuantity`|`EAction.ProductQuantity`||
||`ym:s:impressionsURL`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsDateTime`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductID`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductName`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductBrand`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductCategory`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductCategory1`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductCategory2`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductCategory3`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductCategory4`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductCategory5`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductVariant`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductPrice`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductCurrency`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:impressionsProductCoupon`|—|См. раздел [Данные электронной коммерции](#ecommerce)||
||`ym:s:offlineCallTalkDuration`|`Goals.CallTalkDuration`|Продолжительность разговора в секундах||
||`ym:s:offlineCallHoldDuration`|`Goals.CallHoldDuration`|Продолжительность ожидания в секундах||
||`ym:s:offlineCallMissed`|`Goals.CallMissed`|Признак пропущенного звонка||
||`ym:s:offlineCallTag`|`Goals.CallTag`|Метки, ассоциированные со звонком||
||`ym:s:offlineCallFirstTimeCaller`|`Goals.CallFirstTimeCaller`|Признак первого звонка от этого клиента||
||`ym:s:offlineCallURL`|`Goals.Call`|Страница, с которой позвонили||
||`ym:s:parsedParamsKey1`|`ParsedParams.Key1`||
||`ym:s:parsedParamsKey2`|`ParsedParams.Key2`||
||`ym:s:parsedParamsKey3`|`ParsedParams.Key3`||
||`ym:s:parsedParamsKey4`|`ParsedParams.Key4`||
||`ym:s:parsedParamsKey5`|`ParsedParams.Key5`||
||`ym:s:parsedParamsKey6`|`ParsedParams.Key6`||
||`ym:s:parsedParamsKey7`|`ParsedParams.Key7`||
||`ym:s:parsedParamsKey8`|`ParsedParams.Key8`||
||`ym:s:parsedParamsKey9`|`ParsedParams.Key9`||
||`ym:s:parsedParamsKey10`|`ParsedParams.Key10`||
|#

## Формулы для вычисляемых полей {#formulas}

Некоторые поля Logs API вычисляются на стороне сервиса, тогда как в Data Streaming передаются необработанные данные. Поля Logs API, которые не имеют прямого аналога в Data Streaming, можно вычислить с помощью формул ClickHouse.

### screenFormat {#formula-screenformat}

```sql
toUInt16(ifNotFinite(ResolutionWidth * 21 / ResolutionHeight, 0)) AS screenFormat
```

Поле `screenFormat` возвращает не разрешение, а число, которое соответствует следующим значениям:

#|
||**Значение**|**Соотношение сторон**||
||0|undefined||
||9|9:21||
||11|9:16||
||12|3:5||
||13|10:16||
||14|2:3||
||15|3:4||
||16|4:5||
||26|5:4||
||28|4:3||
||31|3:2||
||33|16:10||
||35|5:3||
||37|16:9||
||49|21:9||
|#

### screenOrientation {#formula-screenorientation}

```sql
toUInt8(
  if(IsTablet OR IsMobile,
    if(WindowClientHeight > 0 AND WindowClientWidth > 0,
      if(WindowClientWidth < WindowClientHeight, 1, 2),
      0),
    if(ResolutionHeight > 0 AND ResolutionWidth > 0,
      if(ResolutionWidth < ResolutionHeight, 1, 2),
      0)
  )
) AS screenOrientation
```

Значения `screenOrientation`:

- `0` — undefined;
- `1` — портретная ориентация;
- `2` — альбомная ориентация.

### physicalScreenWidth {#formula-physcreenwidth}

```sql
if(
  UserAgent IN (2, 6, 72, 137, 14) OR (UserAgent = 70 AND NOT IsMobile),
  toUInt32(ResolutionWidth),
  toUInt32(ifNotFinite(ResolutionWidth * DevicePixelRatio, 0)) + bitAnd(toUInt16(toUInt32(ifNotFinite(ResolutionWidth * DevicePixelRatio, 0))), 1)
) AS physicalScreenWidth
```

### physicalScreenHeight {#formula-physcreenheight}

```sql
if(
  UserAgent IN (2, 6, 72, 137, 14) OR (UserAgent = 70 AND NOT IsMobile),
  toUInt32(ResolutionHeight),
  toUInt32(ifNotFinite(ResolutionHeight * DevicePixelRatio, 0)) + bitAnd(toUInt16(toUInt32(ifNotFinite(ResolutionHeight * DevicePixelRatio, 0))), 1)
) AS physicalScreenHeight
```

### isNewUser {#formula-isnewuser}

Для определения новых пользователей используется атрибуция по времени первого визита. Сравните `UTCStartTime` первого визита с `UTCStartTime` текущего визита. Если значения совпадают, текущий визит — первый для данного пользователя.

```sql
TrafficSource.StartTime[indexOf(TrafficSource.Model, 3)] = UTCStartTime AS isNewUser
```

Где атрибуция `3` — «Первое посещение».

## Атрибуция {#attribution}

В визитах Data Streaming, в отличие от Logs API, атрибуция хранится массивами. Все массивы `TrafficSource.XXX` соответствуют друг другу по типу атрибуции. Порядок элементов в массивах отражает, по какой модели атрибуции (`TrafficSource.Model`) считается значение поля `TrafficSource.XXX`, а внутри массива находится само значение.

Чтобы получить значение поля `XXX` в нужной модели атрибуции `YYY`, используйте функцию `indexOf`:

```sql
TrafficSource.XXX[indexOf(TrafficSource.Model, YYY)] AS XXX
```

### Модели атрибуции

#|
||**Код**|**Модель атрибуции**||
||1|Последний переход||
||5|Последний значимый переход (кросс-девайс)||
||6|Первый переход (кросс-девайс)||
||11|Автоматическая (кросс-девайс)||
|#

### Источники трафика

Значения в поле `TrafficSource.ID`:

#|
||**Код**|**Источник**||
||-1|Внутренние переходы||
||0|Прямые заходы||
||1|Переходы по ссылкам на сайтах||
||2|Переходы из поисковых систем||
||3|Переходы по рекламе||
||4|Переходы с сохраненных страниц||
||5|Не определен||
||6|Переходы по внешним ссылкам||
||7|Переходы с почтовых рассылок||
||8|Переходы из соцсетей||
||9|Переходы из рекомендательных систем||
||10|Переходы из мессенджеров||
||11|Переходы по QR-коду||
|#

### Пример

```sql
SELECT
    VisitID,
    TrafficSource.ID[indexOf(TrafficSource.Model, 1)] AS lastTrafficSourceID, -- Источник трафика по атрибуции «Последний переход»
    TrafficSource.ID[indexOf(TrafficSource.Model, 5)] AS cd_last_significant_TraficSourceID, -- Источник трафика по атрибуции «Последний значимый переход» (кросс-девайс)
    TrafficSource.ID[indexOf(TrafficSource.Model, 6)] AS cd_first_TraficSourceID -- Источник трафика по атрибуции «Первый переход» (кросс-девайс)
FROM your_database.your_visits_table
WHERE StartDate = today() - 1
```

Подробнее о работе с массивами в ClickHouse см. в [документации ClickHouse](https://clickhouse.com/docs/ru/guides/clickhouse/working-with-arrays).

## Гео-данные {#geo}

В Data Streaming нет готовых полей с названиями стран и городов. Гео-данные представлены идентификаторами регионов (например, `RegionID`). Чтобы получить названия регионов по идентификаторам, используйте встроенные функции ClickHouse для работы с гео-словарями, например `regionToName`:

```sql
SELECT
    RegionID,
    regionToName(RegionID, 'ru') AS regionName
FROM your_database.your_visits_table
LIMIT 10
```

Подробнее о функциях работы с гео-данными см. в [документации ClickHouse](https://clickhouse.com/docs/sql-reference/functions/ym-dict-functions#regiontoname).

## Данные электронной коммерции {#ecommerce}

В Data Streaming данные электронной коммерции хранятся в массивах:

- **`EAction.*`** — массив действий с товарами в течение визита. В одном визите могут быть действия с просмотренными товарами, добавленными в корзину и купленными товарами. Тип действия можно узнать с помощью поля `EAction.Type`.
- **`EPurchase.*`** — массив покупок в течение визита. За один визит может быть совершено несколько покупок.
- **`EPurchaseWithProducts.*`** — массив купленных товаров. Совпадает с `EAction.*`, где оставлены только покупки (`EAction.Type = 3`).

{% note alert %}

Если информация о покупке передана без заполнения массива `products`, массив `EPurchase` будет содержать данные о покупке, но `EAction.Type = 3` в массиве `EAction` будет отсутствовать.

{% endnote %}

- **`EPromotion.*`** — массив действий с внутренними промокампаниями в течение визита. Тип действия с промокампанией можно определить по полю `EPromotion.Type`.
