0

现有对象和内容

有一个名为 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 条记录。请建议

4

1 回答 1

0

我认为您想将更新日期放入这样的临时表中

select distinct [update date], identity(int, 1,1) history_id 
into #updatedates
order by [update date]

这给了你一张这样的桌子

update date history_id
2012-08-01  1
2012-09-01  2
2012-10-01  3

然后将其与您的原始表格加入以获得您的结果

select mh.[item no], mh.[vaild from], mh.[valid to], u.history_id
from master_history mh join #updatedates u on mh.[update date] = u.[update date]
于 2013-01-10T09:54:55.107 回答