【发布时间】:2012-10-12 20:07:05
【问题描述】:
我有表 t_stats 与列 id (INT) 和列 ratio (DECIMAL(8,4))。
id 是独一无二的。
我想查询表 t_stats 以选择具有相同 AVG(ratio) 的 3 个组(尽可能接近)。
可以使用临时表来完成,只要我可以将它作为脚本或存储过程运行。
编辑:这是具体示例:
输入:
id ratio
-- -----
24 0.930000
25 0.390000
26 0.800000
27 0.920000
28 0.550000
30 0.810000
31 0.770000
32 0.800000
33 0.590000
36 0.760000
37 0.910000
40 0.690000
43 0.390000
45 0.310000
46 0.760000
47 0.710000
54 0.710000
55 0.950000
57 0.920000
60 0.890000
62 0.700000
66 0.890000
68 0.950000
107 0.760000
559 0.990000
560 0.540000
565 0.430000
566 0.830000
568 0.590000
579 0.970000
599 0.900000
623 0.450000
749 0.800000
750 0.970000
753 0.820000
754 0.730000
766 0.620000
768 0.430000
770 0.790000
838 0.700000
875 0.835000
987 0.900000
988 0.740000
1157 0.850000
1250 0.630000
1328 0.860000
2171 0.900000
2176 0.520000
2177 0.980000
2178 0.940000
2180 0.970000
2184 0.990000
2187 0.950000
2188 0.940000
2189 0.920000
2195 0.990000
2233 0.900000
2234 0.940000
2235 0.950000
2240 0.980000
2243 0.920000
2253 0.900000
2266 0.530000
2269 0.920000
2270 0.970000
2271 0.750000
2272 0.820000
2275 0.910000
2277 0.930000
2281 0.690000
2282 0.710000
2288 0.840000
2528 0.870000
2778 0.950000
2814 0.990000
输出:
groupId id ratio
------- -- -----
1 24 0.930000
1 25 0.390000
1 27 0.920000
1 30 0.810000
1 32 0.800000
1 36 0.760000
1 54 0.710000
1 60 0.890000
1 559 0.990000
1 560 0.540000
1 566 0.830000
1 568 0.590000
1 623 0.450000
1 750 0.970000
1 838 0.700000
1 987 0.900000
1 1157 0.850000
1 2178 0.940000
1 2180 0.970000
1 2253 0.900000
1 2269 0.920000
1 2271 0.750000
1 2281 0.690000
1 2778 0.950000
1 2814 0.990000
2 26 0.800000
2 28 0.550000
2 31 0.770000
2 40 0.690000
2 45 0.310000
2 55 0.950000
2 57 0.920000
2 66 0.890000
2 107 0.760000
2 565 0.430000
2 579 0.970000
2 753 0.820000
2 754 0.730000
2 766 0.620000
2 875 0.835000
2 1328 0.860000
2 2176 0.520000
2 2177 0.980000
2 2184 0.990000
2 2187 0.950000
2 2189 0.920000
2 2233 0.900000
2 2234 0.940000
2 2275 0.910000
2 2282 0.710000
3 33 0.590000
3 37 0.910000
3 43 0.390000
3 46 0.760000
3 47 0.710000
3 62 0.700000
3 68 0.950000
3 599 0.900000
3 749 0.800000
3 768 0.430000
3 770 0.790000
3 988 0.740000
3 1250 0.630000
3 2171 0.900000
3 2188 0.940000
3 2195 0.990000
3 2235 0.950000
3 2240 0.980000
3 2243 0.920000
3 2266 0.530000
3 2270 0.970000
3 2272 0.820000
3 2277 0.930000
3 2288 0.840000
3 2528 0.870000
所以我想制作 3 组 n 值,并针对特定的平均值 x。 (n=30 和 0.75 < x < 0.85 的示例看起来像 3 组,每组 30 个值,每组有 0.75 < AVG(ratio) < 0.85,id 只能属于 1 组。)
所以每个组的平均值几乎相同,接近x:
groupId avg(ratio)
------- ----------
1 0.805600
2 0.789000
3 0.797600
【问题讨论】:
-
这就像旅行商问题。您需要比较所有组合并选择表现最佳的组合。即使是中等大小的数据集,它也有大量的组合!除非你乐于做出天真的估计? [按大小排序,第 1-3 行转到第 1-3 组,然后第 4-6 行转到第 1-3 组,依此类推]
-
目前这是我使用的。但我希望有一个不那么天真的解决方案。
-
你需要看看优化算法。 SQL 并不是最好的环境。
-
@Dems:我在标签中添加了
C#和linq-to-sql,如果这有助于提供更优化的解决方案。
标签: algorithm sql-server-2008 c#-4.0 linq-to-sql