Вы можете думать об этих понятиях так:
- каждая строка является сеансом
- технически каждая строка с totals.visits = 1 является допустимым сеансом
hits
- массив, содержащий структуры, которые содержат информацию для каждого попадания
Вы можете писать подзапросы для массивов - в основном обрабатывать их как таблицы. Я бы рекомендовал изучить Работа с массивами и применить / перенести каждое упражнение непосредственно на hits
, если возможно.
Пример для подзапросов на уровне сеанса
SELECT
fullvisitorid,
visitStartTime,
(SELECT SUM(IF(type='EVENT',1,0)) FROM UNNEST(hits)) events,
(SELECT COUNT(DISTINCT CONCAT(eventInfo.eventCategory,eventInfo.eventAction,eventInfo.eventLabel) )
FROM UNNEST(hits) WHERE type='EVENT') uniqueEvents,
(SELECT SUM(IF(type='PAGE',1,0)) FROM UNNEST(hits)) pageviews
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_20170801`
WHERE
totals.visits=1
LIMIT
1000
Пример выравнивания до уровня удара
Существует также возможность использовать поля в массивах для группировки, если вы скрещиваете массивы объединения с их родительской строкой
SELECT
h.type,
COUNT(1) hits
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_20170801` AS t CROSS JOIN t.hits AS h
WHERE
totals.visits=1
GROUP BY
1
Относительно связи между visitId и Sessions вы можете прочитать этот ответ .