SQL中如何获取同一时间段下各记录的最新版本?
获取时间段记录的最新版本
我有一张包含时间段(from_date和to_date列)及关联值的表,需要获取其中的最新记录。难点在于,随着时间推移的更新,同一时间段存在多个版本,每条记录包含用于确定版本的creation_date字段。
表结构
CREATE TABLE tab ( id INTEGER, from_date DATE, to_date DATE, creation_date TIMESTAMP, value INTEGER, from_timestamp TIMESTAMP, to_timestamp TIMESTAMP );
示例数据
| id | from_date | to_date | creation_date | value | from_timestamp | to_timestamp |
|---|---|---|---|---|---|---|
| 1 | 2014-10-01 | 9999-12-31 | 2014-10-01 10:00:05 | 100 | 2014-10-01 00:00:00 | 9999-12-31 00:00:00 |
| 2 | 2014-10-01 | 2016-08-10 | 2015-10-01 10:00:05 | 100 | 2014-10-01 00:00:00 | 2016-08-11 00:00:00 |
| 3 | 2016-08-11 | 9999-12-31 | 2015-10-01 10:00:05 | 120 | 2016-08-11 00:00:00 | 9999-12-31 00:00:00 |
| 4 | 2014-10-01 | 9999-12-31 | 2016-10-01 10:00:05 | 100 | 2014-10-01 00:00:00 | 9999-12-31 00:00:00 |
| 5 | 2014-10-01 | 9999-12-31 | 2017-10-01 10:00:05 | 200 | 2014-10-01 00:00:00 | 9999-12-31 00:00:00 |
| 6 | 2014-10-01 | 2016-08-10 | 2018-10-01 10:00:05 | 200 | 2014-10-01 00:00:00 | 2016-08-11 00:00:00 |
| 7 | 2016-08-11 | 9999-12-31 | 2018-10-01 10:00:05 | 300 | 2016-08-11 00:00:00 | 9999-12-31 00:00:00 |
| 8 | 2014-10-01 | 2016-09-10 | 2019-10-01 10:00:05 | 200 | 2014-10-01 00:00:00 | 2016-09-11 00:00:00 |
| 9 | 2016-09-11 | 2021-01-20 | 2019-10-01 10:00:05 | 300 | 2016-09-11 00:00:00 | 2021-01-21 00:00:00 |
| 10 | 2021-01-21 | 9999-12-31 | 2019-10-01 10:00:05 | 350 | 2021-01-21 00:00:00 | 9999-12-31 00:00:00 |
业务更新逻辑
- 初始时,时间段
2014-10-01至9999-12-31被赋值100(id 1)。 - 随后拆分时间段:
2014-10-01至2016-08-10赋值100,2016-08-11至9999-12-31赋值120(id 2和3)。 - 之后再次合并时间段
2014-10-01至9999-12-31并赋值100(id 4)。 - 接着,该合并时间段被更新为200(id 5)。
- 再次拆分时间段:
2014-10-01至2016-08-10更新为200,2016-08-11至9999-12-31更新为300(id 6-7)。 - 最后调整时间段拆分:
2014-10-01至2016-09-10赋值200;2016-09-11至2021-01-20赋值300;2021-01-21至9999-12-31赋值350(id 8-10)。
需求与已尝试方法
需求:编写查询语句,返回记录的最新版本。
已尝试方法:使用ROW_NUMBER()函数结合PARTITION BY,按from_date和to_date对记录进行分区,但未成功。
内容的提问来源于stack exchange,提问作者foxbuur
相关产品推荐
相关产品推荐

