Teradata SQL无法去除文本中重复邮箱问题求助
Teradata SQL 去除每行重复邮箱的解决方案
场景分析
通常出现每行重复邮箱的情况,要么是用聚合函数拼接时未去重,要么是源数据本身就是已拼接好的重复邮箱字符串。以下分两种场景给出对应解决方法:
场景1:多行邮箱聚合拼接时出现重复
如果你的查询是通过LISTAGG将同一ID下的多行邮箱拼接成字符串,但未做去重,直接在LISTAGG中加入DISTINCT关键字即可:
SELECT id, LISTAGG(DISTINCT email, ',') WITHIN GROUP (ORDER BY email) AS unique_emails FROM your_source_table GROUP BY id;
注意:Teradata 16.10及以上版本支持
LISTAGG(DISTINCT),旧版本需用替代方法。
场景2:源数据是已拼接的重复邮箱字符串
如果每行的邮箱已经是用分隔符(比如逗号)拼接好的字符串,需要先拆分、去重再重新聚合:
WITH split_deduplicate AS ( SELECT t.id, s.token AS single_email FROM your_source_table t -- 拆分字符串为单行邮箱,参数依次为分组键、待拆分字符串、分隔符 CROSS JOIN TABLE (STRTOK_SPLIT_TO_TABLE(t.id, t.emails, ',')) s WHERE s.token IS NOT NULL -- 过滤空邮箱 GROUP BY t.id, s.token -- 对每个ID下的邮箱去重 ) SELECT id, LISTAGG(single_email, ',') WITHIN GROUP (ORDER BY single_email) AS unique_emails FROM split_deduplicate GROUP BY id;
旧版本Teradata兼容方案(不支持LISTAGG(DISTINCT))
如果你的Teradata版本较低,无法使用LISTAGG(DISTINCT),可以用ROW_NUMBER()先标记重复项,再过滤后聚合:
WITH ranked_emails AS ( SELECT id, email, -- 按ID和邮箱分组,标记重复项 ROW_NUMBER() OVER (PARTITION BY id, email ORDER BY email) AS rn FROM your_source_table ) SELECT id, LISTAGG(email, ',') WITHIN GROUP (ORDER BY email) AS unique_emails FROM ranked_emails WHERE rn = 1 -- 只保留每个邮箱的第一条记录 GROUP BY id;
示例验证
输入数据:
| id | emails |
|---|---|
| 1 | a@x.com,b@x.com,a@x.com |
| 2 | c@y.com,c@y.com |
执行上述查询后,期望输出:
| id | unique_emails |
|---|---|
| 1 | a@x.com,b@x.com |
| 2 | c@y.com |
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

