複数のUPDATEクエリをPostgreSQLの1つのクエリに統合したいと思います。ここで複数のUPDATEクエリを統合する
は、問題のテーブルのスキーマです:pointDailyHistory
id | integer | not null default nextval('pointdailyhistory_id_seq'::regclass)
deposit | integer | not null default 0
withdrawal | integer | not null default 0
balance | integer | not null default 0
depositday | date | not null
Indexes:
"pointdailyhistory_depositday_key" UNIQUE, btree (depositday)
は、この表の目的は、日常的に(撤退)消費(預金)獲得ポイントとポイントを追跡することです。その理由は、最初に獲得したポイントが最初に消費されるポリシー(FIFO)を有効にすることです。
12月1日に100ポイントを獲得したとします。次に、次のINSERTを実行します。
INSERT INTO pointDailyHistory (deposit, balance, depositday) VALUES (100,100,'2016-12-01');
同じ日に別の50ポイントを獲得したとします。
INSERT INTO pointDailyHistory (deposit, balance, depositday) VALUES (30,30,'2016-12-02');
簡単にこれまでのところ:私は次の日(12月2日)で30ポイントを獲得した場合、私は以下のINSERTを実行することになり
UPDATE pointDailyHistory SET deposit=deposit+50,balance=balance+50 WHERE depositday='2016-12-01';
:私は、次のUPDATEを実行することになります。今、引き出しのために。上記のFIFOを満たすために、 私は残高がゼロよりも大きい最も古い日に払い戻しを実行したいと思います。私は12月3日に160ポイントを撤回した場合ので、私は以下を実行したい
:
UPDATE pointdailyhistory SET withdrawal=150,balance=0 WHERE depositday='2016-12-01';
UPDATE pointdailyhistory SET withdrawal=10,balance=20 WHERE depositday='2016-12-02';
少数の行を更新するときにこれが細かいですが、UPDATE文の数があればポイントが急騰します幅広い日付の間に得られ、1日で消費されます。
どのようなヒント、解決策が大歓迎です!
で
CTEのドキュメント私は最初の場所でバランスを保管しないだろうと私は '同じ日のために既存の行をupdate'ません - 唯一の新しい行を挿入します。残高にすばやくアクセスする必要がある場合は、残高のみを保持する第2のテーブルを作成し、pointdailyhistoryテーブルのトリガーで更新してください。 –
こんにちは、迅速な返信に感謝します。私はあなたの第2のポイントを理解しています。上記のようには言及していませんが、最新の残高を把握するためのバランステーブルがあります。 UPDATINGではなくINSERTを使用しています - 私は考えを出し、それが自分の要件を満たしているかどうかを確認します。あなたの提案をありがとう。 – kiseragi
バランステーブルを既に持っているなら、なぜそれを 'pointdailyhistory'に残しておくのですか? –