在使用UNNEST函数处理Google BigQuery中JOIN结构中的数组时,我遇到了问题。
我有一个查询要根据Google BigQuery中的Firebase数据计算移动应用程序的MAU(月活跃用户)。而且效果很好。
然后,我尝试计算完成特定事件的用户,并且它也起作用。
但是,当我尝试通过事件的参数(保存在数组中)过滤事件时,在JOIN结构中使用UNNEST函数遇到了问题。
参数:
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
如果在JOIN结构中使用UNNEST,该如何使用?
非常感谢!
答案 0 :(得分:0)
执行数组过滤的更好方法是不使用UNNEST
。请同时使用EXISTS
和UNNEST
。
例如
WHERE
EXISTS(SELECT 1 FROM UNNEST(event_params) WHERE key = 'isCommented' AND value.string_value = 'true')
执行数组子查询过滤的优点是它不会破坏使查询更加可读的粒度。