所以这是我的情况:我有两个包含统计信息的表,一个用于统计定义的表,一个用于统计事件的表。统计事件表中的每一行都有一个时间戳、一个值和一个对其应用的统计定义的引用,每个统计定义都有一个统计条目的集合。(即一对多)
我的应用程序允许用户选择统计定义和日期范围,并为所选定义绘制统计事件表中的条目。但是,用户可以选择较大的日期范围,这可能会导致返回的事件数量超出所需。
我想返回在用户选择的时间范围内均匀分布的数据子集(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)如果数据是聚集的(即某个时间附近有很多记录,而另一个时间附近没有很多记录),则选择将被加权到数据最多的地方。这不一定是坏事,但我希望我的图表更漂亮,并且数据点分布均匀。
那么,有没有人知道以更有效的方式实现相同结果的聪明方法?
谢谢!