2

イベントのデータベーステーブルがあります。各イベントには、カテゴリと日付/時刻があります。

(実際には、イベントには、カテゴリやその他のさまざまなプロパティに含まれるサブカテゴリがありますが、この簡略化された例では省略されています)

時間とカテゴリごとのエントリを含むリストを生成し、イベントの数とその割合をリストします。

date            | category | number of events | percentage
----------------------------------------------------------
2012-01-01 1:00 | cat-1    | 10               | 50%
2012-01-01 1:00 | cat-2    | 10               | 50%
2012-01-01 2:00 | cat-1    | 1                | 10%
2012-01-01 2:00 | cat-2    | 9                | 90%
2012-01-01 3:00 | cat-1    | 3                | 100%
...

パーセンテージを効率的に計算するのに問題があります。これが私がこれまでに持っているものです:

var results = datacontext.events.
  groupBy(e=>new   
  {  // group by category and hour
     category = e.category,
     datetime = new DateTime (
       e.datetime.Year, e.datetime.Month, e.datetime.Day, 
       e.datetime.Hour, 0, 0 ) 
     // use date+hour for grouping, ignore minutes/seconds
  }).
  select(group => new 
  {
     category = group.Key.category,
     datetime = group.Key.datetime,
     numberOfEvents = group.count(),
     percentage = group.count() / ["total number of events for this hour"] * 100.0
  }

理想的にはエレガントで効率的な方法で、[この時間のイベントの総数]の値を取得するにはどうすればよいですか?

4

2 に答える 2

4

これが私が思いついたものです:

        var results = from events in datacontext.events
                      let date = new DateTime(
                             events.datetime.Year, events.datetime.Month, events.datetime.Day,
                             events.datetime.Hour, 0, 0)
                      let total = datacontext.events.Where(x => x.datetime.Date == date.Date && x.datetime.Hour == date.Hour).Count()
                      group events by new
                      {  // group by category and hour
                          category = events.category,
                          datetime = date,
                          total = total
                      } into e
                      select new
                      {
                          category = e.Key.category,
                          day = e.Key.datetime.Day,
                          numberOfEvents = e.Count(),
                          percentage = (float)e.Count() / (float)e.Key.total
                      };

2つの焦点:

  1. パーセンテージにフロートを使用する
  2. letの合計を計算するために使用するDate
于 2012-04-10T15:34:36.573 に答える
1

最初に日ごとにグループ化し、次にそこから合計を選択する必要があります...次のようなものです。

var resultsPerDay = datacontext.events.groupBy(e=>new {
    datetime = new DateTime (
        e.datetime.Year, e.datetime.Month, e.datetime.Day, 
        e.datetime.Hour, 0, 0 )
    }
}).select(group=>new {
    datetime = group.Key.datetime,
    totalForADay = group.Key.count()
});



var results = datacontext.events.
  groupBy(e=>new   
  {  // group by category and hour
     category = e.category,
     datetime = new DateTime (
       e.datetime.Year, e.datetime.Month, e.datetime.Day, 
       e.datetime.Hour, 0, 0 ) 
     // use date+hour for grouping, ignore minutes/seconds
  }).
  select(group => new 
  {
     category = group.Key.category,
     datetime = group.Key.datetime,
     numberOfEvents = group.count(),
     percentage = 100 * group.count() / resultsPerDay.where(p=>p.datetime == group.Key.datetime).select(p=>p.totalForADay).SingleOrDefault()
  }

ただし、これが最も効率的な方法かどうかはわかりません。また、私はこれをコンパイラーに通さなかったので、構文が良いかどうかはわかりませんが、あなたはその考えを理解しています。

于 2012-04-10T15:31:20.767 に答える