Dados de amostra
Dados esperados
Preciso anexar negociações sob um pedido em um registro, consegui fazer isso usando string_agg
, agora preciso dividir os pedidos com valor máximo de 10. Ou seja, a quantidade para o pedido único não deve ultrapassar 10, preciso combinar negócios sob um único pedido, tanto quanto possível, pois são desejáveis menos pedidos alterados.
Por exemplo: posso combinar o tradeid 11 e 12, o total acumulado é 9, mas quando combino o tradeid 13 ele se torna 12 (excede 10), então isso precisa estar em uma ordem separada.
Pretendo classificar as negociações para poder agrupar por orderid e classificar para obter o resultado. Usando o SQL Server 2016.
Script para criar a tabela de amostra.
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)
Segundo exemplo
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)
resultado esperado
Na realidade, o máximo seria cerca de 1.000 pedidos em 10 negociações por pedido. Uma boa solução aproximada deve ser suficiente.
Supondo que você queira empacotar as negociações apenas em uma ordem estrita de identificação comercial:
Solução CTE recursiva
Saída
Com o outro conjunto de dados de amostra, a saída é:
db<> demonstração de violino
Plano de execução
ATUALIZAÇÃO: como apontou macro32, isso na verdade não funciona para todos os casos. Estou deixando aqui porque o bit que identifica todas as combinações possíveis que somam o limite CTE_RR funciona, mas não consigo pensar em uma maneira de obter conjuntos únicos (pelo menos não no momento).
Portanto, esta resposta só está aqui porque consegue resolver parte do problema.
Aqui está uma solução possível para você que não depende de loops ou outras abordagens baseadas em cursor. Pode não ser a solução com melhor desempenho, mas fornece uma lista de combinações de pedidos que somam o limite especificado, pelo menos para os dados de amostra fornecidos.