You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery含嵌套字段表选唯一行报错:ARRAY类型字段不可用SELECT DISTINCT

解决BigQuery含嵌套/数组字段表的去重问题

首先得明确:BigQuery的SELECT DISTINCT不支持直接包含ARRAY类型字段,因为数组属于复合数据结构,无法直接进行唯一性哈希判断,这就是你报错的核心原因。针对你的表结构(包含industry这个重复RECORD字段),这里有几种实用的解决方案:

方法1:将数组字段转为字符串后使用DISTINCT

把数组字段转成JSON字符串,让整行的所有字段都变成可哈希的类型,就能用DISTINCT判断唯一性了。最后再把字符串转回数组类型,保留原始结构:

SELECT DISTINCT
  company_name,
  vat_number,
  -- 先转字符串去重,再转回数组类型
  PARSE_JSON(TO_JSON_STRING(industry)) AS industry
FROM `<your-table>`

方法2:使用GROUP BY + 数组聚合函数

如果你的业务场景允许基于非数组字段(比如company_name和vat_number)分组,或者需要对重复键对应的数组做合并去重,可以用GROUP BY配合ARRAY_AGG:

SELECT
  company_name,
  vat_number,
  -- 合并相同键下的industry数组,并去重其中的元素
  ARRAY_AGG(DISTINCT industry_element ORDER BY industry_element.name) AS industry
FROM `<your-table>`
-- 先把重复的RECORD数组拆分成单行
CROSS JOIN UNNEST(industry) AS industry_element
GROUP BY company_name, vat_number

要是你需要严格保留整行唯一性(即只有当company_name、vat_number和industry数组完全相同时才算重复),可以用数组的JSON字符串作为分组依据:

SELECT
  company_name,
  vat_number,
  ARRAY_AGG(industry LIMIT 1)[OFFSET(0)] AS industry
FROM `<your-table>`
GROUP BY company_name, vat_number, TO_JSON_STRING(industry)

方法3:使用窗口函数标记唯一行

通过窗口函数给相同内容的行分组排序,然后取每组的第一行,适合需要保留原始行顺序或有特定排序优先级的场景:

WITH ranked_rows AS (
  SELECT
    *,
    ROW_NUMBER() OVER(
      PARTITION BY company_name, vat_number, TO_JSON_STRING(industry)
      ORDER BY company_name -- 可替换为插入时间等你需要的排序字段
    ) AS row_num
  FROM `<your-table>`
)
SELECT company_name, vat_number, industry
FROM ranked_rows
WHERE row_num = 1

内容的提问来源于stack exchange,提问作者Juta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:11:08