質問: (ほぼほぼ、処理系の話というよりもアルゴリズムの話になってしまいます。) ### 前提・実現したいこと PostgreSQLでデータ管理している自作POSシステムから、MS-Accessに部分的にデータを取り込んで分析ツールを作っております。 (データの取り込みは、テーブル単位で全レコードを対象にしています。) 分析ツール上で商品の分類ごとに「交差比率」を算出しており、この処理を高速化したいと考えています。 ### 発生している問題・エラーメッセージ 「交差比率」の算出には、「粗利益÷在庫高」を先に求める必要があります。 「粗利益」は、指定期間中の売上高と仕入高の差で簡単に求められます。 「在庫高」の算出に時間がかかっていて困っています。 ![略式在庫高算出のイメージ](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/7f69eff48590573385bd5929a9c48d3d.png) 「在庫高」の算出には、日毎の商品点数を求める必要があります。 POSシステムから抽出できるデータに、店舗間の商品移動(や売上や入荷)を捉えられるテーブルがあるので、各日付ごとの在庫高を求めるのに経過日数分商品の移動を追跡し該当日の在庫高を求めます。 しかし、特に過去の日付になればなるほど過去の商品移動を洗い出すのに時間がかかってしまいます。 (10年以上の商品移動履歴を蓄えているテーブルのため、MS-Access上でインデックスを設定していても遅いです。 とはいえ集計期間は昨対を見る程度なので過去3年程度で十分な範囲ですが。) そのため、略式の算出方法として、月ごとに集計期間を分割して、月初と月末の2箇所のみを使って求める方式で一旦実装しています。 しかし、図に示すようにどうしても在庫高にはずれが生じてしまいます。 ### 補足 商品一つ一つ、日付ごとに何点どの店舗にあったのか、を記録するテーブル(在庫高テーブル)を作れば良さそうに思うのですが、商品のブランドごと、アイテム種類ごと、店舗ごと、ブランドの中でも商品番号(家電などでの型番のようなもの)ごとの集計をしており、在庫高テーブルに蓄えるデータ量が爆発的の膨らむのが想像できて、そういう実装は諦めました。 ### 追記:多数の回答ありがとうございます 業務がたて込み、ツール改修になかなか着手できずにおります。 BA決定までしばらく猶予ください。
回答: > > 在庫高テーブルに蓄えるデータ量が爆発的の膨らむ > > > というご懸念について、もし ``` 精度の高い「交差比率」を求めたいのは過去3年程度まで。 それ以前は多少ズレても構わない。 ``` と割り切ることが可能なら、在庫高テーブルに格納するデータの期限を「過去3年程度」に限定してしまってはいかがでしょうか? アプリケーション側の実装が少々面倒になりますが、在庫高の算出方法を ・3年以内 => 在庫高テーブルから ・それ以前 => 略式の算出方法で と、切り替えるわけです。 これなら、全期間のデータを蓄えるのと比べて在庫高テーブルのデータ量の増加を緩和できますので。