Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以取消使用array_CONCAT_AGG创建的数组的测试_Sql_Google Bigquery - Fatal编程技术网

Sql 是否可以取消使用array_CONCAT_AGG创建的数组的测试

Sql 是否可以取消使用array_CONCAT_AGG创建的数组的测试,sql,google-bigquery,Sql,Google Bigquery,在BigQuery中,我有以下查询: 选择 `订单源作为订单源, `order`.键作为order_键, 任何值“订单”。日期为订单日期, 订购产品密钥作为密钥, 任何_VALUEorder_product.sku作为sku, 任何_VALUEorder_product.name作为名称, 任何\u值订单\u产品。数量作为数量, 任何价值订单产品小计作为收入, 数组_CONCAT_AGGmoved_数量作为移动数量 从…起 `analytics.spr.stock\u move\u装运` 分组

在BigQuery中,我有以下查询:

选择 `订单源作为订单源, `order`.键作为order_键, 任何值“订单”。日期为订单日期, 订购产品密钥作为密钥, 任何_VALUEorder_product.sku作为sku, 任何_VALUEorder_product.name作为名称, 任何\u值订单\u产品。数量作为数量, 任何价值订单产品小计作为收入, 数组_CONCAT_AGGmoved_数量作为移动数量 从…起 `analytics.spr.stock\u move\u装运` 分组 `订单`。来源:, `命令`。键, 订单\产品密钥 analytics.spr.stock_move_装运中的每一行都重复了move_quants字段。正如您在查询中所看到的,我正在将行分组在一起,并使用array\u CONCAT\u AGG为组创建一个移动数量数组

然而,我真正想做的是对这些移动的数量执行一些聚合,并在每一行中显示这些结果。我想我可以把SELECT语句的最后一行改成这样:

选择 `订单源作为订单源, `order`.键作为order_键, 任何值“订单”。日期为订单日期, 订购产品密钥作为密钥, 任何_VALUEorder_product.sku作为sku, 任何_VALUEorder_product.name作为名称, 任何\u值订单\u产品。数量作为数量, 任何价值订单产品小计作为收入, 从UNNESTARRAY\u CONCAT\u AGGmoved\u quants t1中选择SUMt1.inventory\u value作为库存值 从…起 `analytics.spr.stock\u move\u装运` 分组 `订单`。来源:, `命令`。键, 订单\产品密钥 但是,我收到以下错误:

Aggregate function ARRAY_CONCAT_AGG not allowed in UNNEST

为什么这是不允许的?难道我不应该简单地取消对array\u CONCAT\u AGG创建的数组的测试吗?是否有更好的方法来实现这一点?

下面是您最简单的选择-只是简单地转换您已经需要的工作,并避免在同一查询中取消对聚合数组的测试-所以您只需将其分离

#standardSQL
SELECT * EXCEPT(moved_quants), 
  (SELECT SUM(inventory_value) FROM UNNEST(moved_quants)) AS inventory_value
FROM (
SELECT
  `order`.source AS order_source,
  `order`.key AS order_key,
  ANY_VALUE(`order`.date) AS order_date,
  order_product.key AS key,
  ANY_VALUE(order_product.sku) AS sku,
  ANY_VALUE(order_product.name) AS name,
  ANY_VALUE(order_product.quantity) AS quantity,
  ANY_VALUE(order_product.subtotal) AS revenue,
  ARRAY_CONCAT_AGG(moved_quants) AS moved_quants
 FROM 
  `analytics.spr.stock_move_shipments`
 GROUP BY
  `order`.source,
  `order`.key,
  order_product.key
)     
注:即时输入,未经测试

但下面是更简单的解决方案

SELECT
  `order`.source AS order_source,
  `order`.key AS order_key,
  ANY_VALUE(`order`.date) AS order_date,
  order_product.key AS key,
  ANY_VALUE(order_product.sku) AS sku,
  ANY_VALUE(order_product.name) AS name,
  ANY_VALUE(order_product.quantity) AS quantity,
  ANY_VALUE(order_product.subtotal) AS revenue,
  SUM((SELECT SUM(inventory_value) FROM UNNEST(moved_quants))) AS inventory_value
 FROM 
  `analytics.spr.stock_move_shipments`
 GROUP BY
  `order`.source,
  `order`.key,
  order_product.key   

我一定会选择最后一个

谢谢!最后一个很好,但是如果您实际需要来自Quant的多个值,您会怎么做?为了简单起见,我只使用了一个,但实际上我需要从数组中输入sumnentory\u value、sumtriff\u amount和一些其他字段。我所能做的最好的是您的第一个解决方案,但使用SELECT AS STRUCT来获取我想要的所有字段。您有更好的主意吗?是的,在这种情况下,您可以使用AS结构的第一个解决方案!我认为这将是在多个和的情况下最理想的方法,而第二个方法——仅适用于一个SUM——我不确定第二个解决方案是否有效。我得到的每个函数参数都是一个表达式,而不是一个查询;要将查询用作表达式,必须用附加的括号将查询包装起来,使其成为标量子查询表达式我刚刚用简化的数据测试了第二个表达式,它适合我!无论如何,你是第一个-对!第二,只需在SUMSELECT SUMinventory_value FROM UNNESTmoved_quants as inventory_value中添加额外的内容,正如我所说的那样-我是免费输入的-所以看起来我只是错过了额外的括号-当我做我上面提到的快速测试时-我实际上有这些额外的内容-这就是为什么它起作用-所以我只是更新了答案:谢谢你检查!