Google bigquery BigQuery中的空数组

Google bigquery BigQuery中的空数组,google-bigquery,Google Bigquery,我有一个包含两列的表: -名称类型:字符串 -订单id类型:int 我想做的是: SELECT name, ARRAY_AGG(DISTINCT order_id) AS ids FROM table GROUP BY name 问题是,order_id列有一些空字段。不是所有的名称都对应一个id。我想要的是一个有两列名称的表,其中原始表中的所有名称仍然存在,如果没有相应的id,则id字段应该为NULL/空。如果存在相应的ID,则ids列应包含属于该名称的所有order_ID的

我有一个包含两列的表: -名称类型:字符串 -订单id类型:int

我想做的是:

SELECT
  name,
  ARRAY_AGG(DISTINCT order_id) AS ids
FROM
  table
GROUP BY
  name
问题是,order_id列有一些空字段。不是所有的名称都对应一个id。我想要的是一个有两列名称的表,其中原始表中的所有名称仍然存在,如果没有相应的id,则id字段应该为NULL/空。如果存在相应的ID,则ids列应包含属于该名称的所有order_ID的数组。当我尝试在空字段上使用ARRAY_AGG时,我得到:ARRAY不能有null元素;写入字段ID时出错

以下方法可以工作,但速度较慢。有没有办法更有效地得到同样的结果

SELECT * FROM
(SELECT name FROM table)
LEFT JOIN
(SELECT name, ARRAY_AGG(DISTINCT order_id FROM table GROUP BY name)
我还尝试使用:

CASE
      WHEN ARRAY_LENGTH(ARRAY_AGG(DISTINCT order_id)) = 0 THEN NULL
      ELSE ARRAY_AGG(DISTINCT order_id)
    END AS ids


在空字段中输入内容不是一个选项/解决方案,它需要是一个整数,任何整数都可能被“误解”为id。

下面的示例适用于BigQuery标准SQL

#standardSQL
SELECT name, ARRAY_AGG(DISTINCT order_id IGNORE NULLS) ids
FROM `project.dataset.table`
GROUP BY name
这里的诀窍在于使用ignorenulls,您可以阅读更多关于

您可以使用下面的虚拟示例测试、播放上面的内容

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'abc' name, 1 order_id UNION ALL
  SELECT 'abc', 2 UNION ALL
  SELECT 'abc', NULL UNION ALL
  SELECT 'xyz', NULL
)
SELECT name, ARRAY_AGG(DISTINCT order_id IGNORE NULLS) ids
FROM `project.dataset.table`
GROUP BY name
结果

Row name    ids  
1   abc     1    
            2    
2   xyz      

根据您的问题描述,我相信您希望使用ignorenulls可选子句,即。正如文档中所解释的,该子句的作用是从数组创建的结果中排除空值

在这里,您可以看到我根据您的描述准备的一个简单示例:

有一张如下所示的桌子:

我们可以使用ARRAY_AGG函数执行查询,例如:

SELECT
  name,
  ARRAY_AGG(order_id IGNORE NULLS) as order_ids
FROM
  `PROJECT.DATASET.TABLE`
GROUP BY
  name
ORDER BY
  name
为了获得以下结果:

如您所见,您指定的三个条件已得到遵守:

原始表中的所有名称仍然存在 如果没有相应的ID,则ID字段应为NULL/空 如果存在相应的ID,则ids列应包含 属于该名称的所有订单ID的数组
SELECT
  name,
  ARRAY_AGG(order_id IGNORE NULLS) as order_ids
FROM
  `PROJECT.DATASET.TABLE`
GROUP BY
  name
ORDER BY
  name