簡體   English   中英

如何在子查詢的 WHERE 子句中使用來自 UNNEST 的多個值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM