从列表中select平均Y的X #s

我有一个数字列表。 我需要find一种方法来select那些平均数大约为Y的数字。

作为一个简单的例子,假设我的列表是:

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

我需要find三个数字的组合,平均值为大约70.可能的解决scheme可能是60, 70, 8050, 70, 9030, 70, 110

我真的不知道如何开始,所以恐怕我没有尝试太多。 我检查了Excel解算器,但无法find一个方法来“或”约束“。

我在使用Excel中的VBA和编写SQL代码方面很不错,但我无法弄清楚如何使用这两种技能来解决这个问题。

任何人有任何想法如何在Excel或SSMS解决这个问题? 如果不是,我应该探索哪些其他选项?

 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) 

基本上你必须查看3个数字的所有可能的组合,以确定平均值是否为70.如果你有一张大桌子,这可能会严重影响系统资源。 如果所有3个数字都小于平均值或大于平均值,那么会限制它减less开销。 等等。当你做所有的组合时,你也会得到重复的对/行,所以你必须以这样的方式sorting值,以便你可以得到不同的值。 如第一栏/数字是最小的,第二,第三,最大的…

我有一个可能的解决scheme:

  1. 将你的值填充到一个数组中
  2. 计算你的平均水平
  3. 在数组中find确切的或近似的值。
  4. 获取值,之后的1个值和1个值。

你可以改变点4的标准。

以下是基于我的评论的SQL方法:

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

假设你想要3个平均值接近70的数字。

希望有所帮助。