【发布时间】:2020-01-29 14:23:52
【问题描述】:
在 BigQuery 上使用标准 SQL,我试图从列中仅选择某些值,具体取决于存储在同一记录的数组中的值。
例如,每条记录都包含 event_timestamp 列和一组用户属性。我只想为满足特定用户属性的事件选择 event_timestamps,例如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 说查询过于复杂,因此此解决方案不可行。
如果它有助于使事情更清楚,这里是一个数据示例: Data Sample
这是一个电子表格,显示了我希望从简化架构中看到的预期结果。 https://docs.google.com/spreadsheets/d/1QGsp5ko54ZtRIdYejoA3tcJ99PCml6dL7sMRJRdLQzc/edit?usp=sharing
【问题讨论】:
标签: sql firebase google-bigquery firebase-analytics