2012-07-27 94 views
3

我在表格中有30個記錄,其中有「箱號」和「重量」欄。 我必須在30個箱子中找到20個箱子,其總重量最接近1000千克。用於查找總重量的SQL查詢

+0

你使用什麼sql引擎? BTW搜索'揹包問題SQL'的一些提示,因爲它不會是微不足道的:) – biziclop 2012-07-27 10:05:00

+0

即時通訊使用SQL服務器 – 2012-07-27 10:08:33

+0

爲什麼你需要使用SQL?編程語言更適合於這樣的問題。您的問題缺少[示例代碼](http://sscce.org/)(這裏是SQL語句)。請爲[samples]使用CREATE TABLE和INSERT ... VALUES(http://weblogs.sqlteam.com/jeffs/archive/2008/05/13/question-needed-not-answer.aspx)。所需的結果不需要作爲示例代碼呈現,因爲結果是代碼的輸出,而不是代碼本身。 – outis 2012-07-27 10:09:39

回答

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

0

你會解決這個問題的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 + . . .)) 

「ON」的條件保證你正在尋找在各組的箱子一次,通過其獨特的ID進行排序。使用「連接」而不是「左連接」可以確保最終有20個盒子。