BigQuery:使用ARRAY_CONCAT()查询会导致错误

时间:2019-01-11 13:16:29

标签: google-bigquery

假设以下查询(从更复杂的查询中简化):

SELECT ARRAY_CONCAT([1, 2], [3, 4], [5, 6]) as count_to_six;

哪个结果为数组[1,2,3,4,5,6]

在以下查询(带有WITH语句)中进行重组会导致错误“ ARRAY_CONCAT(或ARRAY_CONCAT_AGG)的参数必须为数组类型,但在[3:8]时为STRUCT,ARRAY,ARRAY>”

WITH q1 AS
(SELECT ([1, 2], [3, 4], [5, 6]) as count_to_six)
SELECT ARRAY_CONCAT(count_to_six) FROM q1

我的问题是:在“ WITH AS”查询中,如何获得与初始查询结果相同的正确查询?

2 个答案:

答案 0 :(得分:0)

在逗号分隔的列表周围使用括号会创建一个结构,因此示例中的WITH子句将创建具有三个数组字段的结构。您可以改为:

WITH q1 AS (
  SELECT [1, 2] AS count_to_six UNION ALL
  SELECT [3, 4] UNION ALL
  SELECT [5, 6]
)
SELECT ARRAY_CONCAT_AGG(count_to_six)
FROM q1

这将在WITH子句中创建三行输入,每行都有一个包含两个元素的数组,然后将它们连接为一个数组。请注意,尽管不能保证数组的顺序,除非您以某种方式利用ARRAY_CONCAT_AGG内的ORDER BY子句。

如果您确实要使用ARRAY_CONCAT,则需要命名该结构的每个字段,然后在函数调用中对其进行引用:

WITH q1 AS (
  SELECT STRUCT([1, 2] AS x, [3, 4] AS y, [5, 6] AS z) AS count_to_six
)
SELECT
  ARRAY_CONCAT(count_to_six.x, count_to_six.y, count_to_six.z)
FROM q1

在这种情况下,结果数组中元素的顺序是明确定义的。

答案 1 :(得分:0)

以下是用于BigQuery标准SQL

db.offers.aggregate([ 
    {$facet :{
        lowest: [
            { $sort: { "model": 1, "price": 1 }}, 
            { 
                $group: { 
                    _id: "$model", 
                    lowestPrice: { "$first": "$price" },
                    lowestPriceDate: { "$first": "$date"},
                }
            }
            ],
        newest: [
            { $sort: { "model": 1, "date": -1 }}, 
            { 
                $group: { 
                    _id: "$model", 
                    newestDate: { "$first": "$date" },
                    newestPrice: { "$first": "$price"},
                }
            }
        ]
    }}
])

另一种选择-更通用,但比第一个更重(但是无论如何,您提到它将成为#standardSQL WITH q1 AS ( SELECT [1, 2] AS arr1, [3, 4] AS arr2, [5, 6] AS arr3 ) SELECT ARRAY_CONCAT(arr1, arr2, arr3) AS count_to_six FROM q1 的一部分)
我认为它最像您的最初期望

a more complex query