2017-11-01 4 views
1

私は数字のリストを持っています。私は簡単な例として約Y.リストからX #s平均を選択Y

までの平均これらの数字のXを選択するための方法を見つける必要がある、のが私のリストがあるとしましょう:

30, 40, 50, 60, 70, 80, 90, 100, 110

と私はの組み合わせを見つける必要があります3つの数字の平均は約70になります。考えられる解は60, 70, 80または50, 70, 90または30, 70, 110です。

私は正直言って始める方法も忘れてしまったので、私はあまり試していないのではないかと心配しています。私はExcelのソルバーをチェックしましたが、「制約」を持つ方法を見つけることができませんでした。

ExcelでVBAを使用してSQLコードを書くのはまともですが、これらのスキルセットを使用してこの問題を解決する方法を理解できません。

誰でもExcelやSSMSでこれに対処する方法がありますか?そうでない場合は、他にどのようなオプションを調べるべきですか?

+0

可能な組み合わせはすべて、1つだけをお望みですか?これはかなり単純なアルゴリズムの問​​題のようです。 – mooseman

+0

こんにちはmmoilanen、私たちはあなたの質問の一部を編集したので、ここでかなりの質問を残したいと思っています。あなたが変更に満足していない場合は、もう一度編集してください。 – MackM

+0

「Y」に最も近い(例えば、「n」がリストのメンバーである「ABS(n-Y)」のうちの最小の「X」を選択する)リストからXメンバーを選択することが1つの方法である。このアプローチは「最良の」解決策を提供しないかもしれませんが、それでも十分です。 VBAまたはSQLのどちらでも実装するのは簡単です。 – xidgel

答えて

0
DECLARE @Table AS TABLE (I INT) 
INSERT INTO @Table VALUES (30),(40),(50),(60),(70),(80),(90),(100),(110) 

SELECT 
    DISTINCT 
    N1 = CASE 
      WHEN t1.I < t2.I AND t1.I < t3.I THEN t1.I 
      WHEN t2.I < t1.I AND t2.I < t3.I THEN t2.I 
      ELSE t3.I 
    END 
    ,N2 = CASE 
      WHEN t1.I > t2.I AND t1.I < t3.I THEN t1.I 
      WHEN t1.I < t2.I AND t1.I > t3.I THEN t1.I 
      WHEN t2.I > t1.I AND t2.I < t3.I THEN t2.I 
      WHEN t2.I < t1.I AND t2.I > t3.I THEN t2.I 
      ELSE t3.I 
    END 
    ,N3 = CASE 
      WHEN t1.I > t2.I AND t1.I > t3.I THEN t1.I 
      WHEN t2.I > t1.I AND t2.I > t3.I THEN t2.I 
      ELSE t3.I 
    END 
FROM 
    @Table t1 
    CROSS JOIN @Table t2 
    CROSS JOIN @Table t3 
WHERE 
    t1.I <> t2.I 
    AND t1.I <> t3.I 
    AND t2.I <> t3.I 
    AND (SELECT AVG(V) FROM (VALUES(t1.I),(t2.I),(t3.I)) t(V)) = (SELECT AVG(I) FROM @Table) 

は、基本的には平均がこれは非常に課税することができます70になるかどうかを判断するために3つの数字のうちのすべての可能な組み合わせを見ているポイントの基準を変更することができます大きなテーブルを持っている場合は、システムリソース。 3つの数字のすべてが平均よりも小さいか、または平均よりも大きいかどうかを見るなど、オーバーヘッドを減らすために、それを制限することは多少あります。すべての組み合わせを実行しているときには、ペア/行が重複して表示されるので、別の値を取得できるように値を並べ替える必要があります。このような、列/数が第2秒、最小で最初の最大の第三...

0

私はそのための可能な解決策があります。

  1. を、アレイ内の正確なまたは近似値を探す
  2. あなたの平均を計算し、アレイ
  3. に自分の価値観を取り込みます。
  4. Get前に1の値と1の値を取得します。

あなたは4

0

としてここに私のコメントに基づいてSQLのアプローチです:

SELECT t.n 
FROM t 
ORDER BY ABS(t.n-70) ASC 
LIMIT 3; 

あなたは、平均に近い3つの数字をしたいと仮定すると70.

希望に役立ちます。

関連する問題