我正在尝试创建一个存储过程来匹配虚假股票市场程序的买家和卖家。我最终想用它来填充交易表以完成人们的订单。这也将在 SQL Server 代理作业中。这是我的表:
Id UserId Type QtyRemaining Price CreatedOn
1 3 BUY 50 1.00 2012-09-09 05:25:48.4470000
2 6 BUY 50 1.00 2012-09-09 19:25:34.4300000
3 5 SELL 30 1.00 2012-09-09 19:22:59.5900000
4 3 SELL 50 0.90 2012-09-09 06:39:34.9100000
5 2 SELLALL 50 1.00 2012-09-09 04:10:01.8400000
进行这些匹配需要满足几个条件:
- 如果是“卖出”订单,买方必须寻找具有 >= 买方想要的股份数量的卖方。如果是“SELLALL”订单,则买方购买股票的数量必须相等。例如,卖方必须卖出 50 股,而买方必须以相同或更低的价格买入 50 股。
- 买家想要股票的最低价格。
- 如果有多个卖家符合上述条件,买家先在最低价格后购买最旧的销售库存。
所以交易者对将是#1 和#4、#2 和#5。因此#3 仍将处于未决状态。
这是我正在使用的代码,但我无法让它与最低价格和最旧的优先匹配:
select o.*, oa.*, r.* from [Order] o
join OrderActivity oa on o.Id = oa.OrderId
join (
select o2.Id, o2.VideoId, o2.UserId, oa2.Price, oa2.QtyRemaining, o2.[Type] from [Order] o2
join OrderActivity oa2 on o2.Id = oa2.OrderId
where o2.Type = 'buy' and oa2.Status = 'open'
) as r on (o.VideoId = r.VideoId and oa.Price <= r.Price and r.QtyRemaining = oa.QtyRemaining and o.UserId != r.UserId)
where (o.Type = 'sell' or o.Type = 'sellall') and oa.Status = 'open'