基于先进先出原则处理证券卖出订单的高效SQL方案问询
高效实现FIFO原则下的证券持仓卖出处理
表结构
我们有一张存储市场资产及其购买日期的临时表##Holdings,表结构定义如下:
CREATE TABLE ##Holdings ( HoldingID INT NOT NULL IDENTITY (1, 1) PRIMARY KEY, Symbol VARCHAR(20) NOT NULL, PurchaseDate DATE NOT NULL, Units INT NOT NULL, PurchasePrice DECIMAL(19, 2) NOT NULL, SoldDate DATE, SoldPrice DECIMAL(19,2) )
现有持仓数据
表中已有的持仓记录通过以下语句插入:
INSERT INTO ##Holdings (Symbol, PurchaseDate, Units, PurchasePrice) VALUES ('ALL','2014-06-30',100, 5.26), ('ALL','2014-07-01',100, 5.26), ('ALL','2014-07-02',100, 5.26), ('ALL','2014-07-03',100, 5.26), ('ALL','2014-07-04',713, 5.26) SELECT * FROM ##Holdings
查询结果如下:
| HoldingID | Symbol | PurchaseDate | Units | PurchasePrice | SoldDate | SoldPrice |
|---|---|---|---|---|---|---|
| 1 | ALL | 2014-06-30 | 100 | 5.26 | NULL | NULL |
| 2 | ALL | 2014-07-01 | 100 | 5.26 | NULL | NULL |
| 3 | ALL | 2014-07-02 | 100 | 5.26 | NULL | NULL |
| 4 | ALL | 2014-07-03 | 100 | 5.26 | NULL | NULL |
| 5 | ALL | 2014-07-04 | 713 | 5.26 | NULL | NULL |
这些资产均为同一证券、同一价格,但购买日期不同。
卖出需求
需要处理一笔卖出订单:以7.65的价格卖出320单位的ALL证券,遵循**先进先出(FIFO,最早购买的持仓优先卖出)**原则。
处理后预期表数据
处理完成后,##Holdings表的预期状态如下:
SELECT * FROM ##Holdings
查询结果:
| HoldingID | Symbol | PurchaseDate | Units | PurchasePrice | SoldDate | SoldPrice |
|---|---|---|---|---|---|---|
| 1 | ALL | 2014-06-30 | 100 | 5.26 | 2015-06-30 | 7.65 |
| 2 | ALL | 2014-07-01 | 100 | 5.26 | 2015-06-30 | 7.65 |
| 3 | ALL | 2014-07-02 | 100 | 5.26 | 2015-06-30 | 7.65 |
| 4 | ALL | 2014-07-03 | 80 | 5.26 | NULL | NULL |
| 5 | ALL | 2014-07-04 | 713 | 5.26 | NULL | NULL |
| 6 | ALL | 2014-07-03 | 20 | 5.26 | 2015-06-30 | 7.65 |
其中第1-3行持仓被完全卖出,第4行仅卖出20单位即可满足剩余需求,因此新增第6行记录该20单位的已售持仓,同时第4行持仓数量减少20,第5行持仓保持不变。
问题
目前可以通过while循环逐行修改记录、更新第4行并插入第6行来实现,但这种方法在表数据量达到百万级时效率极低,请问是否有更高效的实现方案?
内容的提问来源于stack exchange,提问作者Golgothen
相关产品推荐
相关产品推荐

