You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于先进先出原则处理证券卖出订单的高效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

查询结果如下:

HoldingIDSymbolPurchaseDateUnitsPurchasePriceSoldDateSoldPrice
1ALL2014-06-301005.26NULLNULL
2ALL2014-07-011005.26NULLNULL
3ALL2014-07-021005.26NULLNULL
4ALL2014-07-031005.26NULLNULL
5ALL2014-07-047135.26NULLNULL

这些资产均为同一证券、同一价格,但购买日期不同。

卖出需求

需要处理一笔卖出订单:以7.65的价格卖出320单位的ALL证券,遵循**先进先出(FIFO,最早购买的持仓优先卖出)**原则。

处理后预期表数据

处理完成后,##Holdings表的预期状态如下:

SELECT * FROM ##Holdings

查询结果:

HoldingIDSymbolPurchaseDateUnitsPurchasePriceSoldDateSoldPrice
1ALL2014-06-301005.262015-06-307.65
2ALL2014-07-011005.262015-06-307.65
3ALL2014-07-021005.262015-06-307.65
4ALL2014-07-03805.26NULLNULL
5ALL2014-07-047135.26NULLNULL
6ALL2014-07-03205.262015-06-307.65

其中第1-3行持仓被完全卖出,第4行仅卖出20单位即可满足剩余需求,因此新增第6行记录该20单位的已售持仓,同时第4行持仓数量减少20,第5行持仓保持不变。

问题

目前可以通过while循环逐行修改记录、更新第4行并插入第6行来实现,但这种方法在表数据量达到百万级时效率极低,请问是否有更高效的实现方案?

内容的提问来源于stack exchange,提问作者Golgothen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:23:20