0

既存のオブジェクトとコンテンツ

master という名前の特定のテーブルが更新されるたびに記録する history_master という名前のテーブルがあります。マスターテーブルの歴史のようなものです。マスター テーブルには最新のデータのみが含まれます

内容の一例を挙げると

マスターテーブル

| | ID | アイテム番号| | から有効 | まで有効
| | 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 は次のようになります

| | ID | アイテム番号 | | から有効 | まで有効 更新日 |
| | 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-05-01 はバッチ = 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 に答える