Teradata中如何筛选首次记录并按月度分组统计?
问题原因
你的查询返回合并的520条记录,核心问题出在这几点:
- 分区逻辑未结合月份维度:仅按
MyFakeAccount分区,会提取客户在七八月所有符合条件记录里的最早一条,导致跨月客户只被统计一次,最终结果是所有唯一达标客户的总数(520条)。 - 时间范围仅筛选单月数据:原WHERE子句的日期条件只取当前日期的上个月数据,无法同时覆盖七八月来分别统计。
- 存在语法错误:
Betweem拼写错误应为Between,TRUNC函数的括号不匹配。
两种解决方案(按需选择)
方案1:按月份输出截止到当月的累计首次达标客户(七月500条,八月520条)
该方案会输出每个月末的累计首次符合条件客户列表,七月末返回500个首次达标客户,八月末返回包含七月500个加八月新增20个的520条记录:
WITH first_qualified_date AS ( -- 先获取每个客户首次符合条件的日期 SELECT MyFakeAccount, MIN(MyFakeDate) AS first_hit_date FROM MyFakeTable WHERE FakeField = 'Y' GROUP BY MyFakeAccount ), target_months AS ( -- 列出需要统计的月份,可手动指定或动态生成 SELECT TRUNC('2024-07-01'::DATE, 'Month') AS stat_month UNION ALL SELECT TRUNC('2024-08-01'::DATE, 'Month') ) -- 关联得到每个月份截止的首次达标客户记录 SELECT tm.stat_month, fqd.MyFakeAccount, fqd.first_hit_date FROM target_months tm JOIN first_qualified_date fqd ON fqd.first_hit_date <= LAST_DAY(tm.stat_month) ORDER BY tm.stat_month, fqd.MyFakeAccount;
方案2:输出每个客户对应月份内的首次符合条件记录
如果需要同一客户在七月、八月均有符合条件记录时,分别提取当月的首次记录(同一客户可能出现在两个月的结果中),使用以下查询:
SELECT TRUNC(MyFakeDate, 'Month') AS stat_month, MyFakeDate, MyFakeAccount FROM MyFakeTable WHERE FakeField = 'Y' -- 按「客户+月份」分区,取当月内的第一条符合条件记录 QUALIFY ROW_NUMBER() OVER ( PARTITION BY MyFakeAccount, TRUNC(MyFakeDate, 'Month') ORDER BY MyFakeDate ) = 1 -- 可选:指定仅统计七八月数据 AND TRUNC(MyFakeDate, 'Month') IN (TRUNC('2024-07-01', 'Month'), TRUNC('2024-08-01', 'Month')) ORDER BY stat_month, MyFakeAccount;
原查询语法修正(仅查询单月首次达标客户)
如果只是修正原查询的语法错误,用于单月数据的首次达标客户提取,调整后代码如下:
SELECT MyFakeDate, MyFakeAccount FROM MyFakeTable WHERE FakeField = 'Y' AND MyFakeDate BETWEEN TRUNC(Current_Date - EXTRACT(Day FROM Current_Date), 'Month') AND LAST_DAY(TRUNC(Current_Date - EXTRACT(Day FROM Current_Date), 'Month')) QUALIFY ROW_NUMBER() OVER (PARTITION BY MyFakeAccount ORDER BY MyFakeDate) = 1;
内容的提问来源于stack exchange,提问作者blue
相关产品推荐
相关产品推荐

