2012-04-10 14 views
2

私はイベントのデータベーステーブルを持っています。各イベントにはカテゴリと日付/時刻があります。Linq-To-SQL GroupBy:パーセンテージ列を計算する方法

番号をリスト、私はそれぞれの時間とカテゴリのエントリのリストを生成したい

(実際のイベントは、カテゴリや様々な他のプロパティに含まれているこの単純な例では取り残されサブカテゴリを持っています)イベントの割合とその割合。

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

は私が思い付いたものです
+0

ありがとう!私は通常、クエリsnytaxを使用しませんが、意味は明らかです。 – HugoRune

+0

私はOPのような同様の問題があり、私のパーセンテージは常に0です。カウントとトータルを浮動小数点数に変換すると、最終的に希望のパーセンテージが得られました。どうもありがとうございました。 :) –

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() 
    } 

これはしかし、最も効率的な方法であるかどうかわかりません。また、私はコンパイラを介してこれを入れていないので、構文が良いかどうかは分かりませんが、あなたはその考えを得ています。焦点の

 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. Date
の合計を計算する letを使用して割合を
  • の山車を使用してここで
  • +0

    ありがとう、これは役立ちます。私は、 '%= 100.0 * group.count()/ events.where(e => e.datetime.Date == group.Key.datetime.Date && e)を使って、groupByの最初のクエリがより効率的であるかどうか疑問に思っています。 .datetime.Hour == group.Key.datetime.Hour) '? – HugoRune

    +0

    私はあなたがどんな違いに気づくか分からない。 –

    関連する問題