我从TSQL的角度来看这个问题,但是任何建议都会受到赞赏。
示例
我有两套标准,用于识别要选择的仓库中的项目。
查询1返回100个项目
查询2返回100个项目
我需要选择查询1中返回的100个项目中的任意25个 我需要选择查询2中返回的100个项目中的任意25个 - 查询1/2中的项目永远不会相同。
每个项目都存储在仓库的一个部分中。
仓库的一部分可能包含许多物品。
我希望选择50个项目(每个查询25个),以减少我必须访问的段数以选择项目。
建议的方法
我最初的想法是组合2个结果集并生成
列表细分ID,NumberOfItemsRequiredInSegment
然后,我会从每个查询中选择25个项目,优先考虑具有最多NumberOfItemsRequiredInSegment的段中的项目。
我知道这不是最优的,但是很容易实现启发式。
问题的
1)我怀疑这是一个标准的组合问题,但我不承认它......也许是多个背包,是否有人认出它?
2)是否有更好的(易于实现)启发式或解决方案 - 理想情况下是在TSQL中?
非常感谢。
答案 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,所以你可以从那里得到计数用作打破平局。