[英]How do you use multiple values from UNNEST in WHERE clause of a subquery?
在 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 說查詢太復雜,因此該解決方案不可行。
這是一個電子表格,顯示了我希望從簡化的模式中看到的預期結果的樣子。 https://docs.google.com/spreadsheets/d/1QGsp5ko54ZtRIdYejoA3tcJ99PCml6dL7sMRJRdLQzc/edit?usp=sharing
你把一些括號弄錯了,你不需要為unnest
使用 FROM 子句
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'
)
您可以在 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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.