如何在Redshift中提取字符串/列表内的唯一值并返回去重后的列表形式
Redshift逗号分隔字符串去重解决方案
实现思路为先将分隔符拆分的字符串拆分为单行条目,去重后再拼接为目标格式字符串,具体实现如下:
适用场景
处理指定字段中以固定分隔符分隔的重复值,实现去重后返回原格式的字符串。以你给出的示例为例,假设存储表名为user_animal_records,可直接使用以下SQL:
SELECT email, LISTAGG(DISTINCT TRIM(animal_item), ', ') AS animal FROM user_animal_records, UNNEST(STRING_TO_ARRAY(animal, ',')) AS t(animal_item) GROUP BY email;
函数说明
STRING_TO_ARRAY(animal, ','):将原animal字段的逗号分隔字符串转换为数组,若分隔符为逗号加空格,可直接替换参数,无需后续TRIM处理UNNEST():将数组拆分为单条记录,每行对应一个动物值TRIM(animal_item):去除单个动物值前后的空格,兼容分隔符前后带空格的场景LISTAGG(DISTINCT ..., ', '):对拆分后的动物值去重后,重新用,拼接为字符串
兼容低版本方案
若使用的Redshift版本不支持LISTAGG的DISTINCT参数,可通过子查询先去重再聚合:
WITH split_animal AS ( SELECT email, TRIM(animal_item) AS animal_item FROM user_animal_records, UNNEST(STRING_TO_ARRAY(animal, ',')) AS t(animal_item) ), deduplicated_animal AS ( SELECT DISTINCT email, animal_item FROM split_animal ) SELECT email, LISTAGG(animal_item, ', ') AS animal FROM deduplicated_animal GROUP BY email;
执行上述代码后即可得到你预期的去重结果:
| animal | |
|---|---|
| ana@gmail.com | Dog, Cat, Bird, Lion |
内容的提问来源于stack exchange,提问作者marni101
相关产品推荐
相关产品推荐

