我被困在選擇查詢中以從這樣的表中獲得最佳匹配:
| 姓名 | 一種 | 乙 | 總計A | 總B |
|---|---|---|---|---|
| 姓名1 | 10 | 1 | 10 | 1 |
| 姓名2 | 15 | 2 | 25 | 3 |
| 姓名 3 | 20 | 3 | 45 | 6 |
| 姓名 4 | 25 | 4 | 70 | 10 |
| 姓名5 | 30 | 5 | 100 | 15 |
| 姓名6 | 35 | 6 | 135 | 21 |
| 姓名7 | 51 | 7 | 175 | 28 |
| ..... | .... | ...... | ...... | ...... |
| ..... | .... | ...... | ...... | ...... |
我試圖找到 B 總和最低的最佳 6 條記錄,但還有一個附加條件,即 A 的總和需要高于 150。
此表按B排序,最好的結果在最上面。所以來自 6 個頂級結果的 B 的總和是 21,但在這種情況下,A 的總和是 135,低于 150。因此記錄 nb 6 應該被排除在外,下一個 nb 7 應該被包括在內。所以最好的結果是記錄 1-5 和 7 中 B = 22 的總和,而 A 的總和是 151,這就足夠了。
我使用了帶有磁區和順序的排名函式,但每次查詢都回傳 0 條記錄。是否有可能排除第 6 條記錄并將 7 取為結果,因此 A 的總和將 > 150?
uj5u.com熱心網友回復:
這似乎是背包問題的一種變體,它是 NP-Complete,最簡單的(編碼)解決方案就是對每個排列進行強力強制。
鑒于您有固定數量的專案,您可以通過自加入來做到這一點
SELECT TOP (1)
*
FROM Items i1
JOIN Items i2 ON i2.Name > i1.Name
JOIN Items i3 ON i3.Name > i2.Name
JOIN Items i4 ON i4.Name > i3.Name
JOIN Items i5 ON i5.Name > i4.Name
JOIN Items i6 ON i6.Name > i5.Name
CROSS APPLY (VALUES (
i1.A i2.A i3.A i4.A i5.A i6.A,
i1.B i2.B i3.B i4.B i5.B i6.B
)) v(TotalA, TotalB)
WHERE TotalA > 150
ORDER BY
TotalB;
Name在這種情況下只是某些獨特列的代理
資料庫<>小提琴
可能有更有效的解決方案,具體取決于您的具體問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343706.html
標籤:sql sql-server 查询语句 秩 背包问题
上一篇:SQL行計數超過磁區
下一篇:在SQL服務器中累計超過N天
