【问题标题】:SQL Query to find total weight查询总重量的 SQL 查询
【发布时间】:2012-07-27 21:59:30
【问题描述】:

我在一个表中有 30 条记录,其中包含“箱号”和“重量”列。 我必须从 30 个箱子中找出总重量最接近 1000 公斤的箱子。

【问题讨论】:

  • 你用什么sql引擎?顺便说一句,搜索knapsack problem sql 以获得一些提示,因为它不会是微不足道的:)
  • 为什么需要使用SQL?编程语言更适合此类问题。您的问题缺少sample code(此处为 SQL 语句)。请使用CREATE TABLEINSERT ... VALUES 作为samples。所需的结果不需要以示例代码的形式呈现,因为结果是代码的输出,而不是代码本身。
  • 这里sqlservercentral.com/articles/T-SQL/90955 你有很多可以玩的。或多或少在页面中间,背包问题解决方案以不同的方式接近,一种应该适合您的需求。
  • 请用表示服务器的标签标记问题。一般来说,通过更新您的帖子而不是回复评论来回应澄清请求。一方面,一个问题应该是可以理解的,无需阅读 cmets。另一方面,SO 是一个问答网站,而不是论坛,并且 cmets 不适合(也不适合)讨论。

标签: sql algorithm


【解决方案1】:

我建议你阅读Knapsack problem

【讨论】:

    【解决方案2】:

    SQL 服务器:

    select TOP 20 box_number 
    from t_boxes 
    group by box_number 
    order by ABS(SUM(box_weight) - 1000) ASC
    

    编辑: 万一我误解了您的问题,而您实际上想解决背包问题。 这是您在 SQL 中真正应该做的事情,但您可以阅读 this 文章,名称非常恰当:现在完全不恰当地使用 SQL Server

    【讨论】:

      【解决方案3】:

      不推荐您在 SQL 中解决此问题的方法,甚至可能在任何机器上都不可行。但是,您可以将蛮力解决方案表示为:

      select box1.id, box2.id, . . . ,
             (box1.weight + box2.weight + . . .)
      from box box1 join
           box box2
           on box2.id > box1.id join
           box box3
           on box3.id > box2.id join
           box box4
           on box4.id > box3.id
           . . .
           box box20
           on box20.id > box19.id
      order by abs(1000 - (box1.weight + box2.weight + . . .))
      

      “开启”条件保证您查看每组框一次,按其唯一 ID 排序。使用“join”而不是“left join”可确保您最终得到正好 20 个框。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-21
        • 2020-07-10
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 2020-07-15
        • 2018-11-24
        • 1970-01-01
        相关资源
        最近更新 更多