Teradata中自动提取最大日期前7天起往前35天数据的方案
Teradata 自动按周期提取指定日期范围数据方案
需求逻辑拆解
核心规则:
- 先定位数据集的最大日期(
max_date) - 结束日期 =
max_date往前推7天 - 开始日期 = 结束日期再往前推35天(等价于
max_date直接减42天) - 最终提取
[开始日期, 结束日期]范围内的数据,且每3个月自动执行查询
实现方案
1. 核心查询逻辑
用CTE预计算日期参数,避免重复扫描表计算最大日期,提升效率:
WITH date_params AS ( SELECT MAX(your_date_column) AS max_date, MAX(your_date_column) - INTERVAL '42' DAY AS start_date, -- 7+35=42,一步计算更高效 MAX(your_date_column) - INTERVAL '7' DAY AS end_date FROM your_target_table ) SELECT t.* FROM your_target_table t JOIN date_params dp ON t.your_date_column BETWEEN dp.start_date AND dp.end_date;
如果需要将结果落地到固定表,可以改写为:
CREATE TABLE IF NOT EXISTS your_result_table AS WITH date_params AS ( SELECT MAX(your_date_column) AS max_date, MAX(your_date_column) - INTERVAL '42' DAY AS start_date, MAX(your_date_column) - INTERVAL '7' DAY AS end_date FROM your_target_table ) SELECT t.* FROM your_target_table t JOIN date_params dp ON t.your_date_column BETWEEN dp.start_date AND dp.end_date WITH DATA PRIMARY INDEX(your_date_column);
2. 每3个月自动执行
方式1:Teradata自带调度
- 将上述查询封装为存储过程(可选,方便调度):
CREATE PROCEDURE extract_period_data() BEGIN -- 先清空结果表(如果需要覆盖旧数据) DELETE FROM your_result_table; INSERT INTO your_result_table WITH date_params AS ( SELECT MAX(your_date_column) AS max_date, MAX(your_date_column) - INTERVAL '42' DAY AS start_date, MAX(your_date_column) - INTERVAL '7' DAY AS end_date FROM your_target_table ) SELECT t.* FROM your_target_table t JOIN date_params dp ON t.your_date_column BETWEEN dp.start_date AND dp.end_date; END;
- 在Teradata Job Scheduler中创建任务,设置执行周期为每3个月(比如季度初执行),指定执行该存储过程。
方式2:外部调度工具
将SQL保存为脚本,通过bteq工具连接Teradata执行,再用Airflow、crontab等工具配置3个月周期的调度任务。
示例数据与预期输出
示例源数据(your_target_table)
| id | your_date_column | value |
|---|---|---|
| 1 | 2022-01-28 | 100 |
| 2 | 2022-01-29 | 200 |
| 3 | 2022-02-15 | 300 |
| 4 | 2022-03-03 | 400 |
| 5 | 2022-03-04 | 500 |
| 6 | 2022-03-10 | 600 |
预期输出
当数据集最大日期为2022-03-10时,筛选范围为2022-01-29至2022-03-03,结果如下:
| id | your_date_column | value |
|---|---|---|
| 2 | 2022-01-29 | 200 |
| 3 | 2022-02-15 | 300 |
| 4 | 2022-03-03 | 400 |
注意事项
- 确保
your_date_column为DATE类型,若存储为字符串需先转换:CAST(your_date_str AS DATE FORMAT 'YYYY-MM-DD') - 调度任务的执行用户需拥有目标表的读写权限、存储过程的执行权限(若使用存储过程)
- 针对大表,建议给
your_date_column创建索引,提升查询过滤效率
内容的提问来源于stack exchange,提问作者Nithya
相关产品推荐
相关产品推荐

