Teradata中按指定列分组判断指定条件下debt_calc是否存在的方法
Teradata 无JOIN实现分组检查字段存在性方案
实现思路
通过Teradata窗口分析函数,按(mnth_end_d, id, name)分组后,在组内判断是否存在period_rank = 'T'且debt_calc非空的记录。利用MAX()聚合配合CASE表达式标记符合条件的记录,再转换为BOOLEAN类型生成debt_exists列。
具体SQL代码
SELECT mnth_end_d, id, name, period_rank, debt_calc, -- 分组内判定目标记录是否存在 CASE WHEN MAX(CASE WHEN period_rank = 'T' AND debt_calc IS NOT NULL THEN 1 ELSE 0 END) OVER (PARTITION BY mnth_end_d, id, name) = 1 THEN TRUE ELSE FALSE END AS debt_exists FROM your_input_table;
代码说明
PARTITION BY mnth_end_d, id, name:指定分组维度,确保同组内所有记录共享同一个debt_exists值MAX(CASE WHEN ... THEN 1 ELSE 0 END) OVER (...):在分组内统计是否存在符合条件的记录,存在则返回1,否则返回0- 外层
CASE将数值结果转换为Teradata支持的BOOLEAN类型(TRUE/FALSE)
输入输出示例
输入表(your_input_table)
| mnth_end_d | id | name | period_rank | debt_calc |
|---|---|---|---|---|
| 2023-01-31 | 101 | Alice | T | 1500.00 |
| 2023-01-31 | 101 | Alice | 1 | 2000.00 |
| 2023-02-28 | 102 | Bob | T | NULL |
| 2023-02-28 | 102 | Bob | 2 | 3000.00 |
| 2023-03-31 | 103 | Charlie | T | NULL |
| 2023-03-31 | 103 | Charlie | 1 | NULL |
输出表
| mnth_end_d | id | name | period_rank | debt_calc | debt_exists |
|---|---|---|---|---|---|
| 2023-01-31 | 101 | Alice | T | 1500.00 | TRUE |
| 2023-01-31 | 101 | Alice | 1 | 2000.00 | TRUE |
| 2023-02-28 | 102 | Bob | T | NULL | FALSE |
| 2023-02-28 | 102 | Bob | 2 | 3000.00 | FALSE |
| 2023-03-31 | 103 | Charlie | T | NULL | FALSE |
| 2023-03-31 | 103 | Charlie | 1 | NULL | FALSE |
内容的提问来源于stack exchange,提问作者samsamara
相关产品推荐
相关产品推荐

