拉链表在数仓的应用十分普遍。它会在原始的表字段里面添加两个新的字段:create_time和end_time这两个。这两个字段的日期代表的是这条数据的开始时间和结束时间,也就是数据的生命周期。
我在开发的过程中会有这么一个问题,那就是我要取某一天的数据,有说法是,也有说法说是:。区别在于end_time的时间是否取等号。这个问题我通过例子来详细理解。
举例:
有一张订单表,6月20号有3条记录:
订单创建日期 | 订单编号 | 订单状态 | create_time | end_time |
---|
2012-06-20 | 001 | 创建订单 | 2012-06-20 | 4921-12-31 |
2012-06-20 | 002 | 创建订单 | 2012-06-20 | 4921-12-31 |
2012-06-20 | 003 | 支付完成 | 2012-06-20 | 4921-12-31 |
到6月21号,表中有6条记录:
订单创建日期 | 订单编号 | 订单状态 | create_time | end_time |
---|
2012-06-20 | 001 | 创建订单 | 2012-06-20 | 2012-06-21 |
2012-06-20 | 001 | 支付完成 | 2012-06-21 | 4921-12-31 |
2012-06-20 | 002 | 创建订单 | 2012-06-20 | 4921-12-31 |
2012-06-20 | 003 | 支付完成 | 2012-06-20 | 4921-12-31 |
2012-06-21 | 004 | 创建订单 | 2012-06-21 | 4921-12-31 |
2012-06-21 | 005 | 创建订单 | 2012-06-21 | 4921-12-31 |
我要取2012-06-21这一天的历史快照数据,
也就是
如果是:
上面整张表里面的数据都可以取到。
如果是:
得出的结果是:
订单创建日期 | 订单编号 | 订单状态 | create_time | end_time |
---|
2012-06-20 | 001 | 支付完成 | 2012-06-21 | 4921-12-31 |
2012-06-20 | 002 | 创建订单 | 2012-06-20 | 4921-12-31 |
2012-06-20 | 003 | 支付完成 | 2012-06-20 | 4921-12-31 |
2012-06-21 | 004 | 创建订单 | 2012-06-21 | 4921-12-31 |
2012-06-21 | 005 | 创建订单 | 2012-06-21 | 4921-12-31 |
少了001创建订单这条数据,所以不取等号,我们取到的数据为这条数据到指定日期当前状态最新的数据。