Используя Стандарт SQL в BigQuery, я пытаюсь выбрать только определенные значения из столбца, в зависимости от того, какие значения хранятся в массиве в той же записи.
Например, каждая запись содержит столбец event_timestamp и массив пользовательских свойств. Я хотел бы выбрать только event_timestamps для событий, где встречается указанное пользовательское свойство c, например, key = 'Level_Number' и value.string_value = '04'; но мне нужно сделать это для нескольких пользовательских свойств в одной и той же таблице, например, отметок времени, где value.string_value = '04' в одном поле и затем где value.string_value = '05 'в следующем.
Проблема в том, что когда я пытаюсь это сделать, я получаю сообщение об ошибке: «Скалярный подзапрос создал более одного элемента».
Например, это запросы, которые я пробовал:
SELECT
user_pseudo_id AS user_id,
(SELECT TIMESTAMP_MICROS(event_timestamp) from `analytics_161693185.events_*`
WHERE EXISTS
(SELECT value.string_value FROM UNNEST (user_properties) WHERE key = "Level_Number" AND value.string_value = '02')) AS time_turned_02,
FROM `analytics_161693185.events_*`
SELECT
user_pseudo_id AS user_id,
(SELECT TIMESTAMP_MICROS(event_timestamp) from `analytics_161693185.events_*`
WHERE
(SELECT value.string_value FROM UNNEST (user_properties) WHERE key = "Level_Number") = '02') AS time_turned_02,
FROM `analytics_161693185.events_*`
SELECT
user_pseudo_id AS user_id,
(SELECT TIMESTAMP_MICROS(event_timestamp) from `analytics_161693185.events_*`
WHERE
(SELECT key FROM UNNEST (user_properties)) = 'Level_Number'
AND (SELECT value.string_value FROM UNNEST (user_properties)) = '02') AS time_turned_02,
FROM `analytics_161693185.events_*`
Но все они выдают одну и ту же ошибку.
Я знаю, что одним из решений является создание временных таблиц с использованием кода, подобного следующему:
WITH
temporary_table_02 AS(
SELECT
user_pseudo_id AS user_id,
TIMESTAMP_MICROS(event_timestamp) AS time_turned_02,
FROM `analytics_161693185.events_*`
WHERE (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = "Level_Number") = '02'
),
Это позволяет Вы можете выбрать значения из этих таблиц и объединить их в новую таблицу, но поскольку существует 18 уровней, создание 18 временных таблиц приводит к тому, что BigQuery говорит, что запрос слишком сложен, поэтому это решение неосуществимо.
Вот пример данных, если это поможет прояснить ситуацию: Образец данных
Вот таблица, показывающая, как я хотел бы, чтобы ожидаемые результаты выглядели из сима Схематичная схема. https://docs.google.com/spreadsheets/d/1QGsp5ko54ZtRIdYejoA3tcJ99PCml6dL7sMRJRdLQzc/edit?usp=sharing