一些大数据开发的项目,特别是基金/证券公司的项目,都经常会涉及到交易日与非交易日的概念。
如果要让你对一张交易日跑批的主表,怎么去补全非交易日的数据呢?
在遇到这种情况的时候,我们要去怎么处理?来,实战一下。
一,自然日数据 = 主表【交易日】left join 时间维表【非交/交】
1,理财产品报价历史表(交易日有数据)
有一张理财产品报价历史(dt分区)表:db_edw.prd_fm_quot_his
字段如下:
prd_cd --(产品代码)
fm_prd_ta_cd --(产品TA代码)
nvlu --(产品净值)
fm_prd_type_cd --(产品类型代码)
dt --(时间分区)
数据如下:(2024-05-24是周五,交易日)
prd_cd | fm_prd_ta_cd | nvlu | fm_prd_type_cd | dt |
A001 | 862479 | 1.01 | 7 | 2024-05-23 |
A001 | 862479 | 0.99 | 7 | 2024-05-24 |
这张表因为是在交易日跑数,所以在非交易日(2024-05-26/周六,2024-05-27/周日),是不存在数据的。
那么怎么让这张表在每一个自然日有数据呢??这个是我们要做的。
2,时间维表(自然日)
一般都会有一张时间维度的表:db_cdm.dim_date (时间维表),记录每一天的信息,比如yyyymmdd,是不是交易日,是周几,是今年的第几天,是今年的第几周,是当月的第几天,是当月的第几周,上一个交易日,下一个交易日,等等。
有一张时间维度的表:db_cdm.dim_date (时间维表)
有如下重要字段:
date_id --自然日(年月日)
trd_day_flag --交易日标志(1为交易日,0为非交易日)
last_trd_date_id --上一个交易日
dt --时间分区
部分数据如下:
date_id | trd_day_flag | last_trd_date_id | dt |
2024-05-23(周四) | 1 | 2024-05-22 | - |
2024-05-24(周五) | 1 | 2024-05-23 | - |
2024-05-25(周六) | 0 | 2024-05-24 | - |
2024-05-26(周日) | 0 | 2024-05-24 | - |
注意:dt为时间维度表的分区字段,每天一个全量数据。
在实际工作开发中,dt=date_sub(current_date(),1)。
为什么要时间减1,因为今天跑昨天的数据的。
3,处理为:理财产品报价历史表(自然日有数据)
处理规则:当然是让理财产品报价历史表,在非交易日那几天,按照上一个交易日的数据信息来使用。
代码如下:
注释:'${v_start_date}', '${v_end_date}' 是时间参数
注意:trd_day_flag = '1' , 为交易日标志
数据如下:
date_id | prd_cd | fm_prd_ta_cd | nvlu | fm_prd_type_cd | dt | trd_date |
2024-05-23 | A001 | 862479 | 101 | 7 | 2024-05-23 | 2024-05-23 |
2024-05-24 | A001 | 862479 | 0.99 | 7 | 2024-05-24 | 2024-05-24 |
2024-05-25 | A001 | 862479 | 0.99 | 7 | 2024-05-24 | 2024-05-24 |
2024-05-26 | A001 | 862479 | 0.99 | 7 | 2024-05-24 | 2024-05-24 |
上图蓝色字段为时间维表的字段。
是通过最后两列来进行关联的。
这样子就把周末两天的非交易日数据也给获取到了。
理财产品报价历史表的dt(交易日),和时间维表(处理之后)的trd_date(交易日),关联会数据发散为所有自然日。
二,自然日数据 = 交易日数据 union all 非交易日数据
当然,如果想要得到全量的自然日的数据,可以和交易日的数据 union all 一把。
4,非交易日数据
注意:trd_day_flag = '0' , 非交易日标志
使用inner join关联。
5,交易日数据 union all 非交易日数据
这样子就得到了全部的自然日的数据了 。
=====================================
当然,推荐使用第一种方法,因为它更加简洁,利用数据发散得到全部自然日的数据。在跑数的时候效率更加高,是第二种方法的优化!!!这样子的写法让你的领导刮目相看,眼前为之一亮。也是一个高级程序员的必备素质。
知识点不难,但都是经验之谈,以后肯定能用上。欢迎一键三连。