Предположим, есть следующий запрос (в этом посте он называется «базовый запрос»):
#standardSQL
SELECT '1' AS session_id, 'product_view' AS event_name, STRUCT(['country','environment'] AS parameter_name, ['NL','production'] AS parameter_value) AS event_details
UNION ALL
SELECT '1' AS session_id, 'lister_view' AS event_name, STRUCT(['country','environment','page_type'] AS parameter_name, ['DE','staging','lister'] AS parameter_value) AS event_details
UNION ALL
SELECT '2' AS session_id, 'product_view' AS event_name, STRUCT(['country','environment'] AS parameter_name, ['DE','production'] AS parameter_value) AS event_details
UNION ALL
SELECT '2' AS session_id, 'checkout_view' AS event_name, STRUCT(['country','environment','page_type'] AS parameter_name, ['GB','production','checkout'] AS parameter_value) AS event_details
UNION ALL
SELECT '2' AS session_id, 'checkout_view' AS event_name, STRUCT(['country','environment'] AS parameter_name, ['NL','staging'] AS parameter_value) AS event_details
Теперь я хотел бы немного изменить структуру этой таблицы, чтобы столбец event_name стал вложенным полем для session_id. Для этого я сделал следующий запрос:
#standardSQL
SELECT session_id, ANY_VALUE(event_name_nested) AS event_name_nested FROM (
SELECT session_id, ARRAY_AGG(event_name) OVER (PARTITION BY session_id) AS event_name_nested FROM (
[base query, please see above]
))
GROUP BY session_id,FORMAT('%T', event_name_nested)
Однако в этой переопределенной структуре я также хотел бы добавить STRUCT под названием «event_details» (подробности см. в базовом запросе выше) для каждого события. Кто-нибудь знает, как это сделать?
Используйте ниже (с минимальными изменениями исходного запроса)
#standardSQL
SELECT session_id,
ANY_VALUE(events_nested) AS events_nested
FROM (
SELECT session_id, ARRAY_AGG(struct(event_name, event_details)) OVER (PARTITION BY session_id) AS events_nested
FROM base_query
)
GROUP BY session_id
выход