2011-10-31 6 views
0

[編集して、コメントを追加いくつかの追加の関連情報]私はこのシナリオを使用して、最良の取引を知っていただきたいと思いベストプラクティスの間-2-日付/ 2-期間は、アルゴリズム

まとめます。各値を反復する代わりに(またはgroupbyで合計する)、私は1つの "最後/最初の違い"メソッドを必要とします。

サンプル ここでの範囲は日付を考慮しています(ただし、月、分、曜日など)時間)

範囲の各ステップ間の値の和を取得し計算する
Fetchcedデータ:この表

<missing> 
2011-01-02 4.5 user1 
2011-01-02 1.5 user2 
2011-01-03 4.7 user1 
2011-01-03 1.6 user2 
2011-01-04 4.9 user1 
2011-01-04 1.7 user2 
2011-01-05 6.1 user1 
2011-01-05 1.8 user2 
<missing> 
2011-01-06 1.9 user2 
2011-01-07 6.5 user1 
2011-01-07 2.0 user2 
2011-01-08 6.9 user1 
2011-01-08 2.1 user2 
2011-01-09 7.0 user1 
2011-01-09 2.2 user2 
<missing> 
<missing> .. 

値が累積順序である番目をいいます。 eyは、ベンが数回始動/停止したタイマーのようにインクリメントされますが、決してREを開始しませんでした。


範囲get 20110101--20110131"を頼まれた場合は、この方法の正確な期間が要求されたget 20110107を頼まれた場合の答え"2011-01-01 3,2"

は、方法は"2011-01-07 0.5"を答えるでしょう。 20110708 user1 6.9マイナス20110707 user1 6.5 == 0.4および20110708 user2 2.1マイナス20110707 user2 2.0 == 0.1であるため、結果は0.5です。次に0.4 + 0.1を追加します。

計算された最後の/最初の値の配列を返すときに問題になります。指定した範囲20110101_20110131の各日の合計を範囲内の各日に実行する必要がある場合は、"sum between last/first value"を実行する必要があります。

結果の範囲内でこの

2011-01-02 0.3 
2011-01-03 0.3 
2011-01-04 1.3 
2011-01-05 0 
2011-01-06 0.1 
2011-01-07 0.5 
2011-01-08 0.2 
2011-01-09 0 
2011-01-10 0 
2011-01-11 0 .. 


欠落期間(日)のように、結果としてゼロにつながります。つまり、20110104_20110105の合計がゼロ以外の値になることはできません(欠損値のため)。ただし、20110104-20110107の間に合計をとると、間に欠けている値が認識されません。

+1

おそらくそれは私だけですが、私はそれを得られません。私はあなたの質問を3回読んだだけで、それは私には感知しません。あなたの意図を言い換えて、明確にしてください。 –

+0

私は試してみてください、 – Independent

+0

@Jonas、あなたは 'get 20110107' =' 2011-01-07 0.5'の仕方を説明することから始めることができます。多分それが私たちの理解を助けるでしょう。 – ANeves

答えて

0

オーケー、それは解決したが、それは本当に解決策単一のq &ないです..

一部psudocode、

ConsumptionOfRange(List someList, Enum somePeriod) 
{ 
    foreach (var user in someList.groupBy(d=>d.Name) 
    { 
     MethodToFillGapsInRange(ref someList) 

     foreach (var period in someList.GroupBy(d => d.Date.Date)) 
     { 
     // Kind of magic here. Ticks is the "weight" of the period somePeriod. 
     // This make query know where in future to look for next valid value. 
     var localValues = 
       (from mv in someList 
        where mv.Date == period.Key 
        || mv.Date.Date == period.Key.AddTicks(Method(somePeriod).Ticks) 
        select mv).ToList(); 

     // At this place, call the generic function used to calculate range. 
     result.Add(ConsumptionRange(dc)); 
     } 
    } 
} 

//That generic function looks like this. 
//Called directly calculating differences between big ranges (1000 or a million of records) 
public AClass ConsumptionOfRange(List someValues) 
{ 
    AClass grouped = 
     (from d in someValues.OrderBy(d=>d.Date) 
     group d by d.Name into gr 
     select new VC 
     { 
      Name = gr.FirstOrDefault().Name, 
      Date = gr.FirstOrDefault().Date, 

      Value = 
       (gr.LastOrDefault().Value 
       - gr.FirstOrDefault().Value) 
       }).FirstOrDefault(); 

    return grouped; 
} 

答えはおそらく別のヘルプの多くではありませんが、多分いくつかのセマンティクスは、このQの後の訪問者に再利用可能です。これをもっとうまくやるためにもう一つのレッスンを学ぶこともできます。

関連する問題