现有对象和内容
有一个名为 history_master 的表,它记录每次更新名为 master 的特定表。它就像一个主表的历史。主表仅包含最新数据
举个内容例子
主表
| 编号 | 货号| 有效期自 | 有效期至 | | 1 | 1 | 2012-12-25 | 2012-12-31 | | 2 | 1 | 2013-01-01 | 2013-04-30 | | 3 | 2 | 2013-01-10 | 2013-12-31 |
history_master 看起来像
| 编号 | 货号 | 有效期自 | 有效期至 | 更新日期 | | 1 | 1 | 2012-01-01 | 2012-06-30 | 2012-02-01 | | 2 | 1 | 2012-07-01 | 2012-12-31 | 2012-02-01 | | 3 | 1 | 2012-01-01 | 2012-06-30 | 2012-05-01 | | 4 | 1 | 2012-07-01 | 2012-11-30 | 2012-05-01 | | 5 | 1 | 2012-12-01 | 2012-12-31 | 2012-05-01 | | 6 | 1 | 2012-07-01 | 2012-11-30 | 2012-08-01 | | 7 | 1 | 2012-12-01 | 2012-12-24 | 2012-08-01 | | 8 | 1 | 2012-12-25 | 2012-12-31 | 2012-08-01 |
手头的任务:编写一个存储过程,从保留最新数据的历史中获取项目的所有可用数据,即结果应该如下所示
| 货号 | 有效期自 | 有效期至 | history_id | | 1 | 2012-12-25 | 2012-12-31 | 8 | | 1 | 2012-12-01 | 2012-12-24 | 7 | | 1 | 2012-07-01 | 2012-11-30 | 6 | | 1 | 2012-01-01 | 2012-06-30 | 3 |
我想到的逻辑是从历史表中确定批次。例如,更新日期为 2012-08-01 的记录的批次 = 3,2012 年 5 月 1 日的批次 = 2,最后一个批次 = 1
从最新的 (3) 到最旧的 (1) 迭代所有批次,比较日期范围并确定结果,记住最新集合的数据将始终具有优先权。
我能想到的唯一实现方法是 WHILE LOOP,我不确定它是否是最好的方法。
截至目前,历史主数据包含 10155734 条记录。请建议