繁体   English   中英

BigQuery:UNNEST()上的LAG()

BigQuery: LAG() on UNNEST()

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我一直在使用LAG()ARRAY of STRUCTARRAY of STRUCT的前一行返回一个值,而UNNEST似乎不支持LAG/LEAD类的导航窗口函数。

听起来不是很理想,但是您需要全部UNNEST和(重新) PARTITION BY

例如,说您要上一行的金额:

编辑 :模式详细信息:

发票架构: docID STRING, lines STRUCT<lineID STRING, amount NUMERIC>

预期的输出: docID STRING, lines STRUCT<lineID STRING, amount NUMERIC, prev_amount NUMERIC>

SELECT 
   docID, lineID, amount
   ,LAG(amount) OVER (PARTITION BY docID ORDER by lineID) prev_amount
FROM invoices, UNNEST(lines)

这很慢。 我希望我们可以通过某种方式将ARRAY作为窗口框架使用。

还有其他选择吗? 我正在使用BigQuery但这可能适用于其他DBMS。

更新 :我想出了以下使用WITH OFFSET替代方案。 更快,也许这就是OFFSET的用途,这很丑陋,在我看来可能更简单。

SELECT 
   docID, lineID, amount
   ,(SELECT amount FROM UNNEST(lines) WITH OFFSET AS pos2 WHERE pos2 = pos - 1) prev_amount
FROM invoices, UNNEST(lines) WITH OFFSET AS pos
2 个回复

下面显示了更好的性能(至少是我为了快速测试而运行的数量很少)。 另外执行计划看起来更好(至少对我而言)

#standardSQL
SELECT 
   lines[OFFSET(pos)].*, lines[SAFE_OFFSET(pos - 1)].amount prev_amount
FROM invoices, UNNEST(GENERATE_ARRAY(0, ARRAY_LENGTH(lines) - 1)) pos

注意:我假设遵循以下架构[STRUCT<docID INT64, lineID INT64, amount FLOAT64>] lines

更新:进行调整以匹配您刚提供的真实架构

#standardSQL
SELECT docID, ARRAY(
    SELECT AS STRUCT 
      lines[OFFSET(pos)].*, 
      lines[SAFE_OFFSET(pos - 1)].amount prev_amount 
    FROM UNNEST(GENERATE_ARRAY(0, ARRAY_LENGTH(lines) - 1)) pos
    ) lines
FROM invoices

在Mikhail答案的替代方案下面,改用WITH OFFSET效果更好(55s与170s,超过5000万行)

#standardSQL
SELECT docID, ARRAY(
    SELECT AS STRUCT 
      l.*, 
      lines[SAFE_OFFSET(pos - 1)].amount prev_amount 
    FROM UNNEST(lines) l WITH OFFSET pos
    ) lines
FROM invoices

注意:如果将ORDER BYWHERE子句添加到更改原始索引的取消嵌套中,则此操作将无法按原样工作。

这是我的用例,如果在过滤后的数组中进行相对定位之后,应该先使用子查询来创建过滤后的数组,然后在外部查询中使用UNNEST WITH OFFSET + OFFSET/ORDINAL组合。

1 BigQuery中的WITH和UNNEST

我发现使用WITH块来分解查询中的逻辑很有帮助。 我以为我不能在ARRAY表达式中的嵌套字段上执行此操作是否正确? 我可以分为嵌套查询-这足够但不理想。 例如,这有效: ...但这不是: ... Error: Unrecognized name: payload at ...

3 Google BigQuery出现UNNEST错误

我使用标准SQL来使用Google BigQuery,但被卡住了。 错误是: UNNEST中引用的值必须是数组。 UNNEST包含[1:1155]类型为STRING的表达式 查询是: ...

4 在BigQuery中使用UNNEST函数

我需要有关如何使用BigQuery UNNEST函数的帮助。 我的查询: 我有一张表,如图所示,我想取消嵌套当前用逗号分隔的字段“ domains”(字符串类型),以便将每个逗号分隔的域分配给每个“ acname”的不同行。 所需的输出也包含在图像中: 在此处输入图片说明 ...

5 Unnest 的 BigQuery 聚合问题

我在 BigQuery(提取 Google Analytics 数据)方面遇到了一些我似乎无法破解的问题。 我很确定我已经将其缩小到 UNNEST 函数,导致我的数据出现大量重复/过度聚合。 我这样做是通过删除 UNNEST 函数和依赖它的所有内容,并提取相同的数据,并且它完全对齐。 这是我的查 ...

7 在 BIGQUERY 上加入 Unnest

我有一个 bigquery 表,我想将它与公共数据集 bigquery-public-data.crypto_bitcoin.transactions 进行外部连接。 由于交易表有两个嵌套字段输入和输出。 join 的结果也有嵌套值。 我想删除那些。 例子 怎么做? ...

8 BigQuery UNNEST重复值

我正在尝试创建Google Analytics(分析)数据的摘要:会话,交易和按小时和按来源属性(在我的情况下为命名服务)的转化率。 我正在从汇总属性数据集中查询名为“ ga_realtime_view”的表。 它是从“ ga_realtime_sessions_”表创建的虚拟视图,该视图允 ...

9 标准 BigQuery Unnest 和 JOIN 问题

我有一个基本的 BigQuery Unnesting Join 问题 我有一个会话事件表和一个设置事件表。 设置事件表有一个名为“数据”的嵌套列。 一旦我展平了 setting_event.data(又名 unnest),其中的一列需要连接到会话事件表中的一列。 有没有办法将会话事件表直接加入未 ...

10 临时 Bigquery 表上的 Unnest 函数

我想知道我是否可以使用 unnest 到临时表? 我尝试了以下操作,但收到一条警告,提示无法识别点击。 #standardSQL WITH ALL__TABLES__ AS ( SELECT * FROM `project.dataset.__TABLES__` UNION ALL SEL ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM