1

この問題をTSQLの観点から見ていますが、アドバイスをいただければ幸いです。

シナリオ

選択する倉庫内のアイテムを識別する2セットの基準があります。

クエリ1は100アイテムを返します
クエリ2は100アイテムを返します

クエリ1で返された100個のアイテムから
25個を選択する必要があります。クエリ2で返された100個のアイテムから25個を選択する必要があり
ます。-クエリ1/2のアイテムは同じではありません。

各アイテムは、倉庫のセグメントに保管されます。
倉庫のセグメントには、多数のアイテムが含まれている場合があります。

アイテムを選択するためにアクセスする必要のあるセグメントの数を減らす方法で、50個のアイテム(各クエリから25個)を選択したいと思います。

推奨されるアプローチ

私の最初のアイデアは、2つの結果セットを組み合わせて、次のリストを作成することでした。

セグメントID、NumberOfItemsRequiredInSegment

次に、各クエリから25個のアイテムを選択し、NumberOfItemsRequiredInSegmentが最も多いセグメント内のアイテムを優先します。

これは最適ではないことはわかっていますが、ヒューリスティックを実装するのは簡単です。

質問

1)これは標準的な組み合わせの問題だと思いますが、私はそれを認識していません..おそらく複数のナップザック、誰かがそれを認識していますか?

2)理想的にはTSQLに、より優れた(実装しやすい)ヒューリスティックまたはソリューションがありますか?

どうもありがとう。

4

1 に答える 1

1

これも最適ではないかもしれませんが、少なくともかなりうまくいくと思います。

クエリ1のこのセットを計算します。

Segment ID, NumberOfItemsRequiredInSegment

NumberOfItemsRequiredInSegmentで並べ替えるだけで、上位25位に入ることができます。このサブセットをAと呼びます。

Aに参加し、「A.segmentIDがnullでない場合は1、それ以外の場合は0、NumberOfItemsRequiredInSegmentFromQuery2」で並べ替えることにより、クエリ2から上位25を取得します。

これを繰り返しますが、最初にクエリ2の上位25を取得します。2セットのより良いパフォーマンスを返します。

これが失敗すると思う1つのシナリオは、このようなものを入手した場合です。

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 に答える