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

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;

示例验证

输入数据:

idemails
1a@x.com,b@x.com,a@x.com
2c@y.com,c@y.com

执行上述查询后,期望输出:

idunique_emails
1a@x.com,b@x.com
2c@y.com

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:49:50