如何从仓库中挑选物品以最大限度地减少SQL中的旅行?

时间:2012-07-24 08:28:14

标签: tsql combinations combinatorics picking

我从TSQL的角度来看这个问题,但是任何建议都会受到赞赏。

示例

我有两套标准,用于识别要选择的仓库中的项目。

查询1返回100个项目
查询2返回100个项目

我需要选择查询1中返回的100个项目中的任意25个 我需要选择查询2中返回的100个项目中的任意25个 - 查询1/2中的项目永远不会相同。

每个项目都存储在仓库的一个部分中。
仓库的一部分可能包含许多物品。

我希望选择50个项目(每个查询25个),以减少我必须访问的段数以选择项目。

建议的方法

我最初的想法是组合2个结果集并生成

列表

细分ID,NumberOfItemsRequiredInSegment

然后,我会从每个查询中选择25个项目,优先考虑具有最多NumberOfItemsRequiredInSegment的段中的项目。

我知道这不是最优的,但是很容易实现启发式。

问题

1)我怀疑这是一个标准的组合问题,但我不承认它......也许是多个背包,是否有人认出它?

2)是否有更好的(易于实现)启发式或解决方案 - 理想情况下是在TSQL中?

非常感谢。

1 个答案:

答案 0 :(得分:1)

这可能也不是最佳的,但我认为至少表现得相当不错。

为查询1计算此设置。

Segment ID, NumberOfItemsRequiredInSegment

进入前25名,只需按NumberOfItemsRequiredInSegment排序。称这个子集为A。

从查询2中排名前25位,加入A并按“当A.segmentID不为空,然后是1,否则为0,NumberOfItemsRequiredInSegmentFromQuery2”进行排序。

重复此操作,但首先从查询2中取出前25名。返回2组中表现更好的表现。

我认为失败的一种情况是,如果你有这样的事情。

Segment   Count Query 1    Count Query 2
A         10               1
B         5                1
C         5                1
D         5                4
E         5                4
F         4                4
G         4                5
H         1                5
J         1                5
K         1                10

你需要确保从选择查询1中的最佳片段时选择A,D,E.为了解决这个问题,你几乎仍然需要加入查询2,所以你可以从那里得到计数用作打破平局。