尽管我已经习惯了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中有效。
答案 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在扁平化方面的差异以及其他主题。