首页 > 解决方案 > SQL 将卷拆分为不重复存储桶 ID 的存储桶

问题描述

我在 MS SQL 中解决了可能很简单但对我来说不可能完成的任务。我有 2 张桌子 - 1 张有公司名称和用过的瓶子的总量。在第二个表中,我有一个具有唯一 ID 及其瓶容量的桶列表。我的任务是为每个公司分配正确数量的桶(以覆盖所有瓶子的体积),而不是两次使用相同的桶(不要为 2 家或 moře 公司重复使用相同 ID 的桶)。有人能帮我吗?谢谢!

标签: sqlsql-serversplit

解决方案


鉴于每个瓶子都相同并且每个桶具有相同容量(根据您的评论)的额外简化,这将起到作用:

-- demo schema
create table companies (cname char, bottlesUsed int);
create table buckets (id int, capacity int);

-- demo data
insert companies values ('a', 41), ('b', 2), ('c', 5), ('d', 50);
insert buckets select top 20 row_number() over (order by object_id), 20 from sys.objects;

with 
   bucketnums as 
   (
      select i = row_number() over (order by id),
             id
      from   buckets
   ),
   bucketRanges as
   (
      select   cname,
               firstBucketNum = 1 + lag(lastBucketNum, 1, 0) over (order by cname),
               lastBucketNum               
      from     (  -- running total of bucket count required by each customer
                  select cname,
                         lastBucketNum = sum(ceiling(bottlesUsed * 1.0 / 20)) 
                           over (order by cname rows unbounded preceding)
                  from   companies
               )  t
   )
   
select   conmpanyName = br.cname,
         allocatedBucketId = bn.id
from     bucketRanges     br
join     bucketnums       bn on bn.i between firstBucketNum and lastBucketNum;

如果瓶子大小或桶容量是可变的,这个问题就会变得更加......“有趣”:)


推荐阅读