Postgresql

通過其所有先前行數據獲取列值的差異

  • May 17, 2022

請考慮這兩個表:

  1. 保險庫
  • id BIGSERIAL 主鍵
  • 名稱 VARCHAR(30) 非空
  1. 交易
  • id BIGSERIAL 主鍵
  • transaction_type VARCHAR(6) NOT NULL – “貸方”或“借方”之間的選擇
  • 數量 NUMERIC(15,6) NOT NULL
  • vault_id BIGINT REFERENCES Vault (id)

在獲取事務行/秒時,我想在事務完成後為剩餘的保險庫餘額獲取一個額外的列。

交易範例:

id      transaction_type        amount      vault_id        vault_balance
1       credit                  100         1               100 // since there was no prev transaction for this vault
5       credit                  400         1               500
12      debit                   200         1               300
20      credit                  100         1               400

我可以添加一列來保存保險庫餘額並將其用於下一次交易。但是假設使用者刪除了一行,例如行 id 為 400 的行 id 被刪除。然後其後續交易金庫餘額應相應更改。因此,對於第 12 行,保管庫餘額將為 -100,第 20 行的保管庫餘額將為 0。

id      transaction_type        amount      vault_id        vault_balance
1       credit                  100         1               100 // since there was no prev transaction for this vault
12      debit                   200         1               -100
20      credit                  100         1               0

我看到它的方式有兩種:

  • 添加一列以儲存交易中的金庫餘額,如果有更改,則應相應更新其後續交易的所有金庫餘額。
  • 也許有一種方法可以獲取所有先前交易金額和目前交易金額之間的貸方和借變異數異。

但我希望有更好的方法?你能幫我處理這種情況的最有效方法嗎?

更新

連結到表小提琴。

像這樣的東西,可能是?

sum(case transaction_type when 'debit' then -1 else 1 end * amount)
over (partition by vault_id order by id rows unbounded preceding and current row)

引用自:https://dba.stackexchange.com/questions/312229