新标准SQL中的BigQuery FLATTEN子句等效

时间:2016-07-01 09:55:00

标签: google-bigquery

我正在尝试使用BQ支持的新标准SQL在BigQuery中运行查询。我目前的任务是尝试使用标准SQL运行以下查询(BQ语法):

SELECT
    u0, u1
FROM
    (SELECT
        MIN(u) as u0, NEST(u) as u1
    FROM
        (FLATTEN((SELECT key, SPLIT(u2,',') as u FROM [dataset.table]),u))
    GROUP EACH BY key
    HAVING u0 <> u1)
GROUP EACH BY u0, u1

我主要遇到FLATTEN操作员的问题。 我到目前为止所做的工作(不完全)是:

SELECT
  u0, u1
FROM
  (SELECT
    (SELECT MIN(uids) FROM UNNEST(u2_arr) u2) u0,
    u2_arr
  FROM
    (SELECT SPLIT(uids, ',') as u2_arr FROM `datase.table`)),
  UNNEST(u2_arr) u1
WHERE u0 <> u1
GROUP BY u0, u1

有关如何使第二个查询与第一个查询类似的任何建议吗?

提前谢谢! ģ

1 个答案:

答案 0 :(得分:2)

假设您的表格如下所示(来自您问题中的代码)

key u2   
1   2,6,3,1,4,5  
2   21,6,32,11,4,5   

下面的BigQuery Standard SQL返回与原始Legacy SQL完全相同的结果

SELECT 
  u0, u1
FROM (
  SELECT
    MIN(u) AS u0, ARRAY_AGG(u) AS u1
  FROM
    (SELECT key, u FROM `datase.table`, UNNEST(SPLIT(u2, ',')) AS u)
  GROUP BY key
), UNNEST(u1) AS u1
WHERE u0 <> u1  

它可能不是从遗留到标准sql的最佳“翻译” - 但是没有确切地知道你想要实现的目标 - 我希望保留代码尽可能接近原始代码

另一方面 - 我不确定it kind of works (not fully)是什么意思,因为我希望你的版本可以正常工作!