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
相关产品推荐
相关产品推荐

