样本数据
预期数据
需要在记录中的订单下追加交易,可以使用 来做到这一点string_agg
,现在我需要拆分订单,最大值为 10。也就是说,单个订单的数量不应超过 10 ,需要合并交易尽可能在单一命令下进行,修改命令越少越好。
例如:我可以组合 tradeid 11 和 12,运行总计为 9,但是当我组合 tradeid 13 时,它会变成 12(超过 10),因此需要采用单独的订单。
我的目标是对交易进行排名,以便我可以按 orderid 和排名进行分组以获得结果。使用 SQL Server 2016。
用于创建示例表的脚本。
create table #order
(
orderid varchar(100),
tradeid varchar(100),
quantity int
)
insert into #order (orderid, tradeid, quantity)
values
('a', 'a1', 5),
('a', 'a2', 4),
('a', 'a3', 3),
('a', 'a4', 12),
('b', 'b1', 9),
('b', 'b2', 8),
('b', 'b3', 7)
第二个例子
INSERT INTO @Test
(OrderID, TradeID, Qty)
VALUES ('a', 11, 5)
, ('a', 12, 4)
, ('a', 13, 3)
, ('a', 14, 5)
, ('a', 15, 1)
, ('b', 21, 9)
, ('b', 22, 8)
, ('b', 23, 7)
预期结果
实际上,最大数量约为 1000 个订单,每个订单 10 笔交易。一个好的近似解应该足够好。
假设您只想按照严格的交易 ID 顺序打包交易:
递归CTE解决方案
输出
对于其他示例数据集,输出为:
db<>小提琴演示
执行计划
更新:正如 Macro32 指出的那样,这实际上并不适用于所有情况。我将其留在这里,因为识别加起来达到阈值 CTE_RR 的所有可能组合的位确实有效,但我想不出从那里获取唯一集合的方法(至少目前不行)。
所以这个答案只是在这里,因为它确实解决了部分问题。
这是一种可能的解决方案,不依赖于循环或其他基于游标的方法。它可能不是性能最好的解决方案,但它确实提供了一个订单组合列表,这些组合总计达到指定的阈值,至少对于所提供的示例数据而言是如此。