【SSIS】特定時点で最新だったデータを集める

アーキテクチャや製品紹介しか書いていなくて、ブログ趣旨からずれてる・・・
ってことで、ちょっとした「技」編

最初は、「特定時点で最新だったデータを集める」です。


テーブルのデータが、1つのIDに1つのレコードとなっていればいいのですが、
主キーなしや、日付・履歴番号が主キーに入っていて、同じデータの中でも最新のものだけを取り出したい時ってありますよね。
マスタの変更履歴が残したいから、変更するときは新しいデータを追加して、古いデータは「削除フラグを立てておく」ってゆーシステムは多いかと。
(履歴がほしいのですから、当然、作成日も登録しますね。)

このとき、最新の有効なマスタは、もちろん削除フラグが立っていないレコードだけを集めればいいのですが、たとえば「先月末時点のマスタ」が必要なときはどうしましょうか?

まず、先月末時点なので作成日が今月以降のものを除外します。
次に、マスターのキー(例えば商品番号)ごとに最新のものを集める必要があります。

SQLServerSQLでは、ROW_NUMBER()関数というのがあって、これを使えばSQLでも実現できます。

でも今は、SSISでの実現方法です。

この時に使えるのが参照コンポーネントです。
参照コンポーネントは、「参照データの中に一致したデータが見つかると、それ以降に一致するものがあっても無視される。」という特性があります。
SQLのJOINとは違うんです。


やり方はこうです

  1. まず、「OLE DB ソース」で「一意なキーのリスト(Distinctしておく)」を取得します。(今月初めて登録されたキーを除外するため、「WHERE条件:作成日<今月1日」をつけておきましょう)
  2. このソースを入力とする「参照」を作成します。
  3. 「参照」の参照ソースにSQLを指定します。

 SQLは、「WHERE条件:作成日<今月1日」「ORDER BY:キ−,作成日 DESC」とします。

ORDER BY に「作成日 DESC」をつけるのが味噌です。
こうすることで、参照データは「キーごとに最新のものが最初に見つかる」ようになります。


***注意点***
「参照」では、参照データをメモリー上に読み込んでから処理が走ります。
フローの実行前に、この読み込み処理が実行されます。
そのため、参照データが多すぎるとメモリーを圧迫して処理が遅くなる場合があります。
できるだけ、「必要な項目だけ」を参照データとして取り込むようにしたほうがいいです。

それでも多すぎる場合・・・メモリを増設するか・・・そのとき考えよう。

じゃーねー