2012-07-24 46 views
1

我正在从TSQL的角度看待这个问题,但任何建议,将不胜感激。如何从仓库中挑选物品以最小化TSQL中的旅行?

情景

我有2套,其识别在仓库中的物品的标准来进行选择。

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

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

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

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

建议的方法

我最初的想法一直是结合2个的结果集,并产生

段ID列表,NumberOfItemsRequiredInSegment

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

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

问题

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

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

非常感谢。

+0

解决了吗?我不知道我遵循,但你不能只做一个SELECT TOP 50 * FROM((SELECT * FROM q1)UNION ALL(SELECT * FROM q2))c ORDER BY NumberOfItemsRequiredInSegment DESC – 2012-07-30 18:43:30

+0

嗨弗雷德里克,不,因为我仍然从每个列表中精确地需要25个 – Jonno 2012-07-30 21:56:43

+0

然后或许SELECT * FROM((SELECT TOP 25 * FROM q1 ORDER BY NumberOfItemsRequiredInSegment)UNION ALL(SELECT TOP 25 * FROM q2 ORDER BY NumberOfItemsRequiredInSegment))a。或者,如果您可以扩大/重述这个问题,那将会很棒。 – 2012-07-31 06:10:16

回答

1

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

计算这组查询1.

Segment ID, NumberOfItemsRequiredInSegment 

取前25,只是通过NumberOfItemsRequiredInSegment排序。称这个子集为A.

通过加入A并按“当A.segmentID不为空时然后为1 else 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 

你需要确保你选择A,d,E,从查询1.选择最佳的段时,为了解决这个你几乎仍然需要加入到查询的两个,这样你就可以得到来自那里的人数用作决胜盘。

+0

我在别的东西腰部深处,但非常感谢答案,我希望能够让我的头部圆滑第二天左右!同样,非常感谢你的回答。 – Jonno 2012-09-26 13:01:18