AWS Athena使用Unnest后去重:过滤数组避免重复行问题
解决数组过滤时避免原始记录重复的问题
你当前用CROSS JOIN UNNEST展开数组后过滤,会把原记录和数组中每个符合条件的元素配对,导致同一条原始记录生成多行结果。要保留原始记录的唯一性,只需要判断数组中是否存在满足条件的元素即可,不需要展开数组。
以下是几种可行的写法:
方法1:用EXISTS子查询判断
这种方式兼容性较好,适用于大多数支持JSON和数组操作的SQL引擎:
SELECT * FROM "events-data" WHERE EXISTS ( SELECT 1 FROM UNNEST(CAST(json_extract(attributes, '$["array_int"]') AS array<int>)) AS t(val) WHERE val > 9 );
方法2:用ANY操作符简化查询
如果你的SQL引擎支持数组的ANY操作符(比如PostgreSQL),可以用更简洁的写法:
SELECT * FROM "events-data" WHERE 9 < ANY(CAST(json_extract(attributes, '$["array_int"]') AS array<int>));
方法3:针对JSON数组的原生函数(以BigQuery为例)
如果是BigQuery这类有专门JSON数组处理函数的引擎,可以直接用JSON_EXTRACT_ARRAY:
SELECT * FROM "events-data" WHERE EXISTS ( SELECT 1 FROM UNNEST(JSON_EXTRACT_ARRAY(attributes, '$.array_int')) AS val WHERE val > 9 );
这些写法都会只返回符合条件的原始记录,不会因为数组中有多个符合条件的元素而生成重复行。
内容的提问来源于stack exchange,提问作者Nishant Dixit
相关产品推荐
相关产品推荐

