Google bigquery BigQuery中的空数组
我有一个包含两列的表: -名称类型:字符串 -订单id类型:int 我想做的是: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的
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