从列表中select平均Y的X #s
我有一个数字列表。 我需要find一种方法来select那些平均数大约为Y的数字。
作为一个简单的例子,假设我的列表是:
30, 40, 50, 60, 70, 80, 90, 100, 110
我需要find三个数字的组合,平均值为大约70.可能的解决scheme可能是60, 70, 80
或50, 70, 90
或30, 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:
- 将你的值填充到一个数组中
- 计算你的平均水平
- 在数组中find确切的或近似的值。
- 获取值,之后的1个值和1个值。
你可以改变点4的标准。
以下是基于我的评论的SQL方法:
SELECT tn FROM t ORDER BY ABS(tn-70) ASC LIMIT 3;
假设你想要3个平均值接近70的数字。
希望有所帮助。