“平整”表的重复字段并进行汇总

时间:2018-07-17 10:38:03

标签: google-bigquery standard-sql

尽管我已经习惯了PostgreSQL和许多其他SQL方言,但是这有点让我感到困惑:

我有一个BigQuery表,看起来像:

orders
|- orderId
|- orderStatus
|- orderLines
   |- sku
   |- price_per_item
   |- quantity

在标准SQL中,我应该这样做:

select orderLines.sku, sum(orderLines.price_per_item * quantity)
from flatten(orders, orderLines.sku) o
where orderStatus = 'valid'

但是“拉平”在标准SQL中不起作用。

所以我可以做这样的事情:

select array(select sku FROM UNNEST(orderLines)) sku, array(select price_per_item from unnest(orderLines)) revenue
from orders

但是,我现在不能对此进行总结,即:

select array(select sku FROM UNNEST(orderLines)) sku, sum(array(select price_per_item from unnest(orderLines))) revenue
from orders
group by sku

我尝试使用“ with”语句来完成此操作以预先创建表。但是结果是一样的。

什么是正确的方法?为什么这看起来很冗长?

我不得不使用旧版SQL感到很生气,因为我还在联接中使用了一个函数,并且该函数仅在标准SQL中有效。

1 个答案:

答案 0 :(得分:1)

如果您熟悉PostgreSQL中的数组,则可能以前使用过UNNEST运算符。在这种情况下,您需要使用它来将数组与表本身连接起来,使重复变得平坦:

select orderLine.sku, sum(orderLine.price_per_item * quantity)
from orders, UNNEST(orderLines) AS orderLine
where orderStatus = 'valid'
GROUP BY sku

(我添加了GROUP BY,因为看起来好像丢失了)。有关数组的更多信息,包括使用UNNEST的示例,see the documentation。如果您习惯于在BigQuery中使用旧版SQL,那么there is a migration guide会描述BigQuery中旧版SQL与标准SQL在扁平化方面的差异以及其他主题。