0

所以这是我的情况:我有两个包含统计信息的表,一个用于统计定义的表,一个用于统计事件的表。统计事件表中的每一行都有一个时间戳、一个值和一个对其应用的统计定义的引用,每个统计定义都有一个统计条目的集合。(即一对多)

我的应用程序允许用户选择统计定义和日期范围,并为所选定义绘制统计事件表中的条目。但是,用户可以选择较大的日期范围,这可能会导致返回的事件数量超出所需。

我想返回在用户选择的时间范围内均匀分布的数据子集(n 个点)。我当前的(天真的)实现如下:

var totalEntries = session.QueryOver<StatEvent>()
                          .Where(x => x.Date > start_date && x.Date < end_date && StatDef.Id == defn.Id)
                          .List()
int modFactor = (int) Math.Ceiling((double)totalEntries.Count/30);
var temp = totalEntries.Where((x, i) => i%modFactor == 0);
return temp.OrderBy(x => x.Date).ToList();

所以我从数据库中检索与日期范围和统计定义匹配的所有记录,然后选择 30 个条目。

这种方法的问题是:

1)从数据库中获取所有条目,然后丢弃我不想要的条目是低效的。

2)如果数据是聚集的(即某个时间附近有很多记录,而另一个时间附近没有很多记录),则选择将被加权到数据最多的地方。这不一定是坏事,但我希望我的图表更漂亮,并且数据点分布均匀。

那么,有没有人知道以更有效的方式实现相同结果的聪明方法?

谢谢!

4

1 回答 1

0

我建议在一组间隔内聚合值,其中间隔的大小计算为所选日期范围的 1/30。您聚合的方式将取决于统计数据,但一个简单的实现可能只是将它们相加或平均它们或获得最大值。

于 2012-06-13T09:32:18.940 回答