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

Teradata:聚合数据时消除重复项的技术实现问询

解决聚合数据时的重复项消除问题

从你的表结构和数据来看,重复的核心是同一个acct(账户)在同一个wk(周)下,chk_lmt和baln_lmt完全相同的多条记录(只是dt不同)。要在聚合时消除这类重复,关键是先对重复维度去重,再进行统计计算。

下面给出两种实用的解决方案,你可以根据需求选择:

方案一:用DISTINCT快速去重后聚合

如果你的聚合统计不需要保留dt字段,只关心每个周内不同限额组合的账户数量,这种方法最直接:

SELECT 
    wk,
    'chk_lmt_chk' AS TYPEs,
    -- 统计chk_lmt为under 1000的唯一账户数
    SUM(CASE WHEN chk_lmt = 'under 1000' THEN 1 ELSE 0 END) AS chk_lmt_under_1000_count,
    -- 统计baln_lmt为under 500的唯一账户数
    SUM(CASE WHEN baln_lmt = 'under 500' THEN 1 ELSE 0 END) AS baln_lmt_under_500_count
FROM (
    -- 先提取唯一的账户-周-限额组合,消除重复记录
    SELECT DISTINCT 
        acct,
        wk,
        chk_lmt,
        baln_lmt
    FROM abc
) AS deduplicated_data
GROUP BY wk;

方案二:用窗口函数保留dt并去重

如果需要保留每个唯一账户对应的dt(比如最早的日期),同时确保每个账户在同一周内只被统计一次,可以用ROW_NUMBER()窗口函数标记唯一记录:

SELECT 
    dt,
    wk,
    'chk_lmt_chk' AS TYPEs,
    -- 按周聚合统计(这里用窗口函数或者GROUP BY都可以,看你的需求)
    SUM(CASE WHEN chk_lmt = 'under 1000' THEN 1 ELSE 0 END) OVER (PARTITION BY wk) AS weekly_chk_lmt_count
FROM (
    SELECT 
        dt,
        wk,
        chk_lmt,
        baln_lmt,
        -- 按账户+周分组,给每条记录编号,取编号为1的(这里按dt升序取最早的记录)
        ROW_NUMBER() OVER (PARTITION BY acct, wk ORDER BY dt ASC) AS record_rank
    FROM abc
) AS ranked_data
WHERE record_rank = 1;

关键说明

  • 重复维度的确定:这里我们以acct + wk + chk_lmt + baln_lmt作为去重依据,因为同一个账户在同一周内的限额配置是一致的,多条dt记录属于冗余数据。如果你的重复逻辑不同,可以调整PARTITION BY或者DISTINCT后的字段。
  • 两种方案的区别:方案一更高效,适合只做统计的场景;方案二更灵活,能保留原始记录的时间信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:56