BigQuery UNNEST дублирует значения - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь создать сводку данных Google Analytics: сеансы, транзакции и коэффициент конверсии по часам и по свойствам источника (в моем случае это именованная служба). Я запрашиваю таблицу с именем "ga_realtime_view" из набора данных свойства накопления. Это виртуальное представление, созданное из таблицы "ga_realtime_sessions_", которое позволяет нам использовать стандартный SQL.

Чтобы получить столбец обслуживания, я должен использовать операцию UNNEST. Однако, когда я делаю это, он дублирует все значения сеансов и транзакций.

Вот запрос:

SELECT
EXTRACT(HOUR FROM TIMESTAMP_SECONDS(visitStartTime) AT TIME ZONE 'Europe/Paris') AS Hour,
hits.sourcePropertyInfo.sourcePropertyDisplayName AS service,
IFNULL(SUM(totals.visits),0) as sessions,
IFNULL(SUM(totals.transactions),0) as transactions,
IFNULL(ROUND((SUM(totals.transactions)/SUM(totals.visits))*100,2),0) AS conversionRate
FROM `XX.ga_realtime_view` AS session, UNNEST(session.hits) AS hits
GROUP BY
Hour,
service
ORDER BY
Hour

Я знаю, что были другие темы об этой проблеме дублирования, однако я не могу найти решение в моем случае.

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 27 июня 2018

Звучит так, будто вы хотите избежать объединения таблицы с массивом (через , UNNEST(session.hits)), поскольку это приводит к дублированию всех итогов. Не совсем понятно, что вы хотите сделать с именами сервисов: если их больше одного, хотите ли вы вернуть массив всех из них? Это один раз подход:

SELECT
EXTRACT(HOUR FROM TIMESTAMP_SECONDS(visitStartTime) AT TIME ZONE 'Europe/Paris') AS Hour,
ARRAY(
   SELECT sourcePropertyInfo.sourcePropertyDisplayName
   FROM UNNEST(session.hits) AS hits
) AS service,
IFNULL(SUM(totals.visits),0) as sessions,
IFNULL(SUM(totals.transactions),0) as transactions,
IFNULL(ROUND((SUM(totals.transactions)/SUM(totals.visits))*100,2),0) AS conversionRate
FROM `XX.ga_realtime_view` AS session
GROUP BY
Hour,
service
ORDER BY
Hour

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

SELECT
EXTRACT(HOUR FROM TIMESTAMP_SECONDS(visitStartTime) AT TIME ZONE 'Europe/Paris') AS Hour,
(SELECT MAX(sourcePropertyInfo.sourcePropertyDisplayName)
 FROM UNNEST(session.hits) AS hits) AS service,
IFNULL(SUM(totals.visits),0) as sessions,
IFNULL(SUM(totals.transactions),0) as transactions,
IFNULL(ROUND((SUM(totals.transactions)/SUM(totals.visits))*100,2),0) AS conversionRate
FROM `XX.ga_realtime_view` AS session
GROUP BY
Hour,
service
ORDER BY
Hour
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...