(ほぼほぼ、処理系の話というよりもアルゴリズムの話になってしまいます。)
前提・実現したいこと
PostgreSQLでデータ管理している自作POSシステムから、MS-Accessに部分的にデータを取り込んで分析ツールを作っております。
(データの取り込みは、テーブル単位で全レコードを対象にしています。)
分析ツール上で商品の分類ごとに「交差比率」を算出しており、この処理を高速化したいと考えています。
発生している問題・エラーメッセージ
「交差比率」の算出には、「粗利益÷在庫高」を先に求める必要があります。
「粗利益」は、指定期間中の売上高と仕入高の差で簡単に求められます。
「在庫高」の算出に時間がかかっていて困っています。
「在庫高」の算出には、日毎の商品点数を求める必要があります。
POSシステムから抽出できるデータに、店舗間の商品移動(や売上や入荷)を捉えられるテーブルがあるので、各日付ごとの在庫高を求めるのに経過日数分商品の移動を追跡し該当日の在庫高を求めます。
しかし、特に過去の日付になればなるほど過去の商品移動を洗い出すのに時間がかかってしまいます。
(10年以上の商品移動履歴を蓄えているテーブルのため、MS-Access上でインデックスを設定していても遅いです。 とはいえ集計期間は昨対を見る程度なので過去3年程度で十分な範囲ですが。)
そのため、略式の算出方法として、月ごとに集計期間を分割して、月初と月末の2箇所のみを使って求める方式で一旦実装しています。
しかし、図に示すようにどうしても在庫高にはずれが生じてしまいます。
補足
商品一つ一つ、日付ごとに何点どの店舗にあったのか、を記録するテーブル(在庫高テーブル)を作れば良さそうに思うのですが、商品のブランドごと、アイテム種類ごと、店舗ごと、ブランドの中でも商品番号(家電などでの型番のようなもの)ごとの集計をしており、在庫高テーブルに蓄えるデータ量が爆発的の膨らむのが想像できて、そういう実装は諦めました。
追記:多数の回答ありがとうございます
業務がたて込み、ツール改修になかなか着手できずにおります。
BA決定までしばらく猶予ください。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
在庫高テーブルに蓄えるデータ量が爆発的の膨らむ
というご懸念について、もし
精度の高い「交差比率」を求めたいのは過去3年程度まで。
それ以前は多少ズレても構わない。
と割り切ることが可能なら、在庫高テーブルに格納するデータの期限を「過去3年程度」に限定してしまってはいかがでしょうか?
アプリケーション側の実装が少々面倒になりますが、在庫高の算出方法を
・3年以内 => 在庫高テーブルから
・それ以前 => 略式の算出方法で
と、切り替えるわけです。
これなら、全期間のデータを蓄えるのと比べて在庫高テーブルのデータ量の増加を緩和できますので。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
補足で諦められている方法がスタンダードかつスマートな方法だと思います。
データが爆発的に増えることで困るのがディスク容量なのか、
検索速度が遅くなりそうということなのかで対処法が変わってきますが、
具体的にデータが爆発的に増えることでどのように困ると判断されましたか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
私なら、日次の在庫高テーブルは諦め、月次の在庫高テーブルを作成します。
または、年次の棚卸しデータ(+棚卸し誤差)を元に在庫高データを作成します。
そこから、該当日のデータを計算すれば、計算量をぐんと減らすことが出来るはずです。
月次くらいであれば、データ容量も許容されるのではありませんか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
POSシステムから抽出できるデータに、店舗間の商品移動(や売上や入荷)を捉えられるテーブルがあるので、各日付ごとの在庫高を求めるのに経過日数分商品の移動を追跡し該当日の在庫高を求めます。
しかし、特に過去の日付になればなるほど過去の商品移動を洗い出すのに時間がかかってしまいます。
在庫高を出すなら、棚卸しのデータから日々の商品の移動を日が増える方向で計算して出すべきではないでしょうか?質問文を読むと最大10年分まで遡る方向で計算しているようなので気になります。
○棚卸しの日→日々の変化(?日分)→該当日→次の棚卸しの日
X該当日←日々の変化(?年分?日分)←現在地
商品がPOSシステムのデータ通りにあれば遡って計算してもズレないでしょうが、実際はいろんな要因でズレるわけで、そのために棚卸しをするわけです。
「交差比率」というものの使い方を理解していないため見当違いの意見かもしれませんが、最大10年分のズレを持つデータから出す数字は果たして価値はあるのでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
データ量によりますが、処理の一部を nysol にするのも手です。http
://qiita.com/gg_hatano/items/7a11e3a203a7646f05bf
私も、quita に書いています。
http://qiita.com/zanjibar/items/3fceeb44bb26693ec83a
1000万行ぐらいまでは、nysol で十分な感触ありです。
nysol の先祖は、高卒の女子職員に、業務アプリを2週間程度で開発できるようにするためにつくられたアプリです。新橋の芸者でもつくれる真空管的なアプリですね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/06/01 18:58
2016/06/06 14:41