Как использовать UNNEST в структуре JOIN? - PullRequest
0 голосов
/ 21 мая 2019

У меня возникли проблемы при использовании функции UNNEST для работы с массивами в структуре JOIN в Google BigQuery.

У меня был запрос на подсчет MAU (ежемесячно активных пользователей) для моего мобильного приложения на основе данных Firebaseв Google BigQuery.И это сработало довольно хорошо.

Затем я попытался подсчитать пользователей, которые завершили определенное событие, и это также сработало.

Однако, когда я пытаюсь отфильтровать событие по его параметрам (которые сохраняются вмассив), я столкнулся с проблемой использования функции UNNEST в структуре JOIN.

Параметры:

event_params.key = 'isCommented' 

и

event_params.value.string_value = 'true'

Без функции UNNEST я обнаружил следующую ошибку:

Cannot access field key on a value with type 
ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, ...>>> at [32:20]
WITH
  calendar AS (
  SELECT
    day
  FROM
    UNNEST(GENERATE_DATE_ARRAY( (
        SELECT
          MIN(PARSE_DATE('%Y%m%d',
              event_date))
        FROM
          `***`.`***`.`***`), (
        SELECT
          MAX(PARSE_DATE('%Y%m%d',
              event_date))
        FROM
          `***`.`***`.`***`), INTERVAL 1 DAY) ) AS day )
SELECT
  c.day AS date,
  COUNT(DISTINCT m.user_pseudo_id ) AS MAU
  --  UNNEST(event_params) AS event_params1
FROM
  calendar AS c
JOIN
  `***`.`***`.`***` AS m
ON
  parse_DATE('%Y%m%d',
    m.event_date) BETWEEN DATE_SUB(c.day, INTERVAL 30 DAY)
  AND c.day
WHERE
  event_name = 'eventCreation'
  AND event_params.key = 'isCommented'
  AND event_params.value.string_value = 'true'
GROUP BY
  date
ORDER BY
  date

Как использовать UNNEST в случае его использования в структуре JOIN?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 11 июля 2019

Лучший способ фильтрации массивов - не использовать UNNEST. пожалуйста, используйте EXISTS & UNNEST вместе.

Например

WHERE
  EXISTS(SELECT 1 FROM UNNEST(event_params) WHERE key = 'isCommented' AND value.string_value = 'true')

Преимущество фильтрации подзапросов в массивах состоит в том, что она не разрушает детализацию, что делает запрос намного более читабельным.

...