1

我从 TSQL 的角度来看这个问题,但是任何建议都将不胜感激。

设想

我有 2 组标准来识别要选择的仓库中的项目。

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

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

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

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

建议的方法

我最初的想法是结合两个结果集并生成一个列表

分段 ID,NumberOfItemsRequiredInSegment

然后,我将从每个查询中选择 25 个项目,优先选择 NumberOfItemsRequiredInSegment 最多的段中的那些。

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

问题

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

2) 是否有更好的(容易实现的)启发式或解决方案——最好是在 TSQL 中?

非常感谢。

4

1 回答 1

1

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

为查询 1 计算该集合。

Segment ID, NumberOfItemsRequiredInSegment

只需按 NumberOfItemsRequiredInSegment 排序即可进入前 25 名。将此子集称为 A。

通过加入 A 并按“A.segmentID 不为空时为 1,否则为 0,NumberOfItemsRequiredInSegmentFromQuery2 的情况”排序,从查询 2 中获取前 25 名。

重复此操作,但首先从查询 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,因此您可以从那里获取计数以用作决胜局。

于 2012-09-20T20:50:20.483 回答