Как вы используете несколько значений из UNNEST в предложении WHERE подзапроса? - PullRequest
2 голосов
/ 29 января 2020

Используя Стандарт 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

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Вы можете добавить скалярные запросы в операторе SELECT, как здесь

SELECT
    user_pseudo_id AS user_id,
    TIMESTAMP_MICROS(event_timestamp),
    (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'Level_Number' LIMIT 1) as LevelNumber
FROM `analytics_161693185.events_*`
WHERE EXISTS (SELECT 1 FROM UNNEST (user_properties) WHERE key = "Level_Number")
0 голосов
/ 29 января 2020

Вы поставили некоторые круглые скобки неправильно, и вам не нужно предложение FROM для unnest

SELECT
user_pseudo_id AS user_id,
TIMESTAMP_MICROS(event_timestamp) 
from `analytics_161693185.events_*`
  WHERE EXISTS 
      (
       SELECT 1 FROM UNNEST (user_properties) 
       WHERE key = "Level_Number" AND value.string_value = '02'
      )
  AND EXISTS 
      (
       SELECT 1 FROM UNNEST (user_properties) 
       WHERE key = "another key" AND value.string_value = '03'
      )
...