Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
垃圾箱包装问题。我宁愿在代码中而不是在数据库中执行此操作,但SQL可能可以处理它。我还没有深入研究,但这篇文章似乎是对一些算法的一个很好的解释:我根本没有得到结果。为什么订单ID 5不能与1和2合并?或者为什么“结果应该是”的例子就足够了,但它看起来没有完_Sql_Algorithm_Tsql_Sql Server 2014 - Fatal编程技术网

垃圾箱包装问题。我宁愿在代码中而不是在数据库中执行此操作,但SQL可能可以处理它。我还没有深入研究,但这篇文章似乎是对一些算法的一个很好的解释:我根本没有得到结果。为什么订单ID 5不能与1和2合并?或者为什么“结果应该是”的例子就足够了,但它看起来没有完

垃圾箱包装问题。我宁愿在代码中而不是在数据库中执行此操作,但SQL可能可以处理它。我还没有深入研究,但这篇文章似乎是对一些算法的一个很好的解释:我根本没有得到结果。为什么订单ID 5不能与1和2合并?或者为什么“结果应该是”的例子就足够了,但它看起来没有完,sql,algorithm,tsql,sql-server-2014,Sql,Algorithm,Tsql,Sql Server 2014,垃圾箱包装问题。我宁愿在代码中而不是在数据库中执行此操作,但SQL可能可以处理它。我还没有深入研究,但这篇文章似乎是对一些算法的一个很好的解释:我根本没有得到结果。为什么订单ID 5不能与1和2合并?或者为什么“结果应该是”的例子就足够了,但它看起来没有完全优化?@ErikE很好的问题:)数量可以超过33,但是如果它是1条订单线,我们可以给它一条连接的订单线,并保持它的原样。我们永远不会拆分订单行。谷歌SQL背包问题。这是非常重要的,SQL并不是解决它的最佳语言。导出数据、挖掘解决方案、导入解决


垃圾箱包装问题。我宁愿在代码中而不是在数据库中执行此操作,但SQL可能可以处理它。我还没有深入研究,但这篇文章似乎是对一些算法的一个很好的解释:我根本没有得到结果。为什么订单ID 5不能与1和2合并?或者为什么“结果应该是”的例子就足够了,但它看起来没有完全优化?@ErikE很好的问题:)数量可以超过33,但是如果它是1条订单线,我们可以给它一条连接的订单线,并保持它的原样。我们永远不会拆分订单行。谷歌SQL背包问题。这是非常重要的,SQL并不是解决它的最佳语言。导出数据、挖掘解决方案、导入解决方案。
Order ID    Client ID   Amount  
1           100001        10    
2           100001        22    
3           100001        13    
4           100001        33    
5           100001        1    
6           100001        5     
7           100001        6    
Order ID    Client ID   Amount  Joined ID   Joined Amount
1            100001       10    100001A         32
2            100001       22    100001A         32
3            100001       13    100001B         13
4            100001       33    100001C         33
5            100001       1     100001D         12
6            100001       5     100001D         12
7            100001       6     100001D         12
select [Client ID], [Joined ID], sum([Amount]) as Total_Amount
from [table_name]
group by [Client ID], [Joined ID]
having sum([Amount]) <= 33
create table #tbl_name
       (OrderID int, 
        ClientID int,
        Amount int, 
        joinedId varchar(15) ,
        joinedAmount int)

insert #tbl_name(OrderID,ClientID,Amount) 
select OrderID,ClientID,Amount from tbl_name

declare cr cursor for  
           select orderId, 
             clientId, 
             amount  
           from tbl_name 
           order by OrderId

declare @summedAmount int, 
        @orderId int,
        @clientId int,
        @amount int,
        @counter int

set @summedAmount=0
set @counter=65


open cr
fetch from cr into @orderId,@clientId,@amount
while (@@fetch_status=0)
begin
        if (@amount + @summedAmount < 33)
        begin
            set @summedAmount=@summedAmount+@amount
            update #tbl_name 
            set    joinedId=cast(@ClientId as varchar(10))+char(@counter),
                   joinedAmount=@summedAmount
            where  orderId=@orderId
        end
        else if (@amount + @summedAmount >33)
        begin
            set @counter=@counter+1
            set @summedAmount=@amount
            update #tbl_name 
            set    joinedId=cast(@ClientId as varchar(10))+char(@counter),
                   joinedAmount=@Amount
            where  orderId=@orderId
        end
        fetch from cr into @orderId,@clientId,@amount
end
close cr
deallocate cr
go

with CTE as
(
    select JoinedId, max(joinedAmount) mx
    from #tbl_name
    group by JoinedId
)
update #tbl_name
set joinedAmount = CTE.mx
from #tbl_name
join CTE on #tbl_name.JoinedId=CTE.JoinedId

select * from #tbl_name 

drop table #tbl_name
-- prepare numbering for iteration
with orders_nr
as 
(
  select row_number() over(order by clientID, id) as [nr],
     o.*
  from orders o

)

,
-- prepare sum totals
re
as
(
  select  id, amount, amount as amount_total ,o.[nr] as nr,
    clientID
  from orders_nr o
  where o.[nr]=1
  UNION ALL
  select o.id, o.amount, 
    CASE WHEN o.clientID <> r.clientID then o.amount
    ELSE o.amount+ r.amount_total END,
    o.[nr] as nr, o.clientID
  from orders_nr o  join re r
    on (o.[nr]=r.[nr]+1)

) 
,

 -- iterate total - evaluate current criteria (<=33)
 re2 as
 (
   select re.id, re.amount, re.amount_total, 
     re.[nr] as [group], re.[nr], re.clientID
   from re
   where re.[nr]=1

   UNION ALL

   select r.id, r.amount, 
     CASE WHEN r.amount+re2.amount_total >33
       OR r.clientID<>re2.clientID
         then r.amount ELSE re2.amount_total+r.amount END
       as amount_total,
   CASE WHEN r.amount+re2.amount_total >33 
     OR r.clientID<>re2.clientID THEN 
     r.[nr] ELSE re2.[group] END as [group], r.[nr], r.clientID
   from re r join re2
     on (r.[nr]=re2.[nr]+1 )

  )
  , group_total
  AS
  (
    select [group], clientID, max(amount_total) as total
    FROM re2
    group by [group], clientID
  ),


  result
  as
  (
      select 
   r.id,  r.clientID, r.amount, 
    cast(r.clientid as varchar(20))
      +'-'+char(64+cast(
        dense_rank() 
          over( partition by r.clientID 
               order by r.[clientID], r.[group])
       as varchar(3))) as joinedID
    ,     gt.total as joinedAmount
 from re2 as r join group_total gt
  on (r.clientID=gt.clientID AND r.[group]=gt.[group])
    )
    select * from result