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
相关产品推荐
相关产品推荐

