【问题标题】:SQL split volume into buckets with no repetition of bucket IDSQL 将卷拆分为不重复存储桶 ID 的存储桶
【发布时间】:2021-08-26 14:58:33
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您使用的数据库产品添加tagWhy should I tag my DBMS
  • edit您的问题(通过点击下面的edit链接)并添加一些示例数据和基于该数据的预期输出为formatted text .请参阅here,了解有关如何创建漂亮的文本表的一些提示。 (edit 你的问题 - 不要在 cmets 中输入代码或其他信息)
  • 瓶子总是一样大吗?
  • 是的,它们的大小相同。连桶容量都一样(20瓶)。

标签: sql sql-server split


【解决方案1】:

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

-- 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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 2022-01-07
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多