0

次のクエリは非常にうまく機能しているようです。

var query =
Session.Query<SomeEvent>()
    .Where(
       p =>
       p.Timestamp >= from.Now
       && p.Timestamp <= to.Now
    )
    .GroupBy(x => x.Timestamp)
    .AsEnumerable()
    .Select(
    x =>
    new SomeEvent {Timestamp = x.Key, DisplayValue = x.Average(y => y.DisplayValue)})
    .OrderBy(x => x.Timestamp);

タイムスタンプ (datetime) に関して重複がある場合は、表示値を平均化します。「解像度」に基づいて値を平均化することも可能かどうか(たとえば、30分で)興味がありますか?

4

1 に答える 1

1

これはどう?解決レベルと呼ばれる概念を導入しました。これにより、タイムスタンプの差の範囲ごとに平準化されたキーが得られます。30 分以内の場合は 1、60 分以内の場合は 2、90 分以内の場合は 3... などです。これらのレベルに基づいて、クエリは各レベルを平均化できます。

double resolutionInMins = 30; // In minites
double divisor = to.Now.AddMinutes(resolutionInMins).Ticks - to.Now.Ticks;

Func<DateTime, double> resolutionLevel = 
    delegate(DateTime timestamp)
{
    return Math.Ceiling((to.Now.Ticks - timestamp.Ticks) / divisor);
};

var query =
    Session.Query<SomeEvent>()
    .Where(p => 
        p.Timestamp >= from.Now && 
        p.Timestamp <= to.Now)
.GroupBy(x => new
{
    ResolutionLevel = resolutionLevel(x.Timestamp)
})
.Select(x => new
{
    ResolutionLevel = x.Key.ResolutionLevel,
    ResolutionAvgValue = x.Average(b => b.DisplayValue)
});
于 2013-09-23T02:45:10.053 に答える