0

私の状況は次のとおりです。統計を含む 2 つのテーブル、統計定義用のテーブル、および統計イベント用のテーブルがあります。統計イベント テーブルの各行には、タイムスタンプ、値、およびそれが適用される統計定義への参照があり、各統計定義には統計エントリのコレクションがあります。(つまり、1 対多)

私のアプリでは、ユーザーは統計の定義と日付範囲を選択でき、選択した定義の統計イベント テーブルからエントリをグラフ化できます。ただし、ユーザーが大きな日付範囲を選択する可能性があり、必要以上の数のイベントが返される可能性があります。

ユーザーが選択した時間範囲に均等に分散されたデータのサブセット (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();

そのため、日付範囲と統計定義に一致する DB からすべてのレコードを取得し、30 のエントリを選択しています。

このアプローチの問題点は次のとおりです。

1) DB からすべてのエントリを取得してから、不要なものを破棄するのは効率的ではありません。

2) データがまとまっている場合 (つまり、特定の時間帯には多くのレコードがあり、別の時間帯にはあまりレコードがない場合)、選択はデータが最も多い場所に重み付けされます。これは必ずしも悪いことではありませんが、グラフがよりきれいになり、データ ポイントが均等に分散されるようにしたいと考えています。

それで、同じ結果をより効率的な方法で達成するスマートな方法を知っている人はいますか?

ありがとう!

4

1 に答える 1

0

一連の間隔で値を集計することをお勧めします。間隔のサイズは、選択した日付範囲の 1/30 として計算されます。集計方法は統計によって異なりますが、単純な実装では、統計を合計したり、平均したり、最大値を取得したりすることができます。

于 2012-06-13T09:32:18.940 に答える