【问题标题】:Avoid correlated subqueries error in BigQuery避免 BigQuery 中的相关子查询错误
【发布时间】:2017-12-15 20:46:55
【问题描述】:

我有一个简单的查询来获取创建交易时使用的货币汇率:

SELECT t.orderid, t.date, 
 (SELECT rate FROM sources.currency_rates r WHERE currencyid=1 AND 
r.date>=t.date  ORDER BY date LIMIT 1) rate
FROM sources.transactions t

这会触发错误:

Error: Correlated subqueries that reference other tables are not 
supported unless they can be de-correlated, such as by transforming 
them into an efficient JOIN.' 

我尝试了几种类型的连接和命名子查询,但似乎都没有。实现这一目标的最佳方法是什么?似乎是一个非常常见的场景,应该很容易在 BQ 的标准 Sql 中实现。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT 
      t.orderid AS orderid, 
      t.date AS date, 
      ARRAY_AGG(r.rate ORDER BY r.date LIMIT 1)[SAFE_OFFSET(0)] AS rate
    FROM `sources.transactions` AS t
    JOIN `sources.currency_rates` AS r
    ON currencyid = 1 
    AND r.date >= t.date
    GROUP BY orderid, date
    

    【讨论】:

    • rate 会不会是这里的数组?
    • 感谢您的建议,但这会导致资源限制错误:“错误:查询超出第 1 层的资源限制。需要第 5 层或更高级别”。 - 会继续试验 :)
    • 搞定了!只需要创建更小的临时表并使用它们,感谢 Mikhail!
    【解决方案2】:

    我注意到其他相关子查询的类似行为。它们很有用,但并不总是能被 BigQuery 自动建模为 JOIN。

    类似的情况:

    #standardSQL
    SELECT name, (
      SELECT AVG(temp) 
      FROM `bigquery-public-data.noaa_gsod.gsod2017` b
      WHERE a.usaf=b.stn  
    ) temp
    FROM `bigquery-public-data.noaa_gsod.stations` a
    LIMIT 10
    

    不起作用:

    #standardSQL
    SELECT name, (
      SELECT temp 
      FROM `bigquery-public-data.noaa_gsod.gsod2017` b
      WHERE a.usaf=b.stn  
      ORDER BY da 
      LIMIT 1
    ) temp
    FROM `bigquery-public-data.noaa_gsod.stations` a
    LIMIT 10
    

    修复:

    #standardSQL
    SELECT name, ARRAY_AGG(temp ORDER BY da LIMIT 1) temp
    FROM `bigquery-public-data.noaa_gsod.stations` a
    JOIN `bigquery-public-data.noaa_gsod.gsod2017` b
    ON a.usaf=b.stn  
    GROUP BY 1
    LIMIT 10
    

    (给我一个公共数据集,我会编写一个适用于您的数据的查询)

    【讨论】:

    • GROUP BY 1 是什么意思? :-/
    • 表示按第一列分组(即GROUP BY name
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多