2017-02-28 3 views
0

現在、私は累積合計を1日ごとに示すグラフを表示していますが、実際にはその日の限界増減akaデルタです。これはどのようにクエリで行うことができますか?残念ながら、累積合計はAPIによって利用可能なすべてです。ここでRailsのcreated_at:conditionに基づいて2つの行を減算します

は私のテーブルです:を撮影

org:   cumulative_donations_count: created_at: 
Goodwill  650       2017-02-28 18:50:20.654996 
Goodwill  300       2017-02-27 18:50:20.654996 
Goodwill  250       2017-02-26 18:50:20.654996 
Goodwill  100       2017-02-25 18:50:20.654996 

ステップ - 私はでself.where(org: goodwill).pluck(created_at:, donations_count:)配列を反復処理するために始めた|、日付値を|配列内のそれぞれのインデックス値で日付を比較しようとしていますが、リードエンジニアは純粋にクエリによってそれを行うことを望んでいます。私はまた、その違いを示すために列を追加することを考えましたが、これらの値に対して多くの異なる計算を実行したいと考えています。

orgが比較するために必要とするレコードの数は、nilを返す必要があります。if <= 1です。明らかに、created_at:値は正確に1日後にミリ秒単位で表示されません。

おそらく、これに似た質問がありますが、この例の条件は、多くの読者にとって役に立つほど簡単です。

UPDATE - 期待される出力

[[2017-02-28, 350],[2017-02-27, 50], [2017-02-26, 150], [2017-02-25, nil]]

+1

期待される出力も表示できますか? –

+0

ありがとうございます。期待どおりに更新されました。 – HashRocketSyntax

答えて

2

を(lagに必要な場合は、0のデフォルト値を使用することができます)、あなたはSQLでlag()を使用します。

select org, cumulative_donations_count, created_at, 
     (cumulative_donations_count - 
     lag(cumulative_donations_count, 1, 0) over (partition by GoodWill order by created_at) 
     ) as inc 
from t; 

これはlag()3-arg formを使用しています。 2番目の引数は、戻るレコードの数です。 3番目は最初のレコードの値です(先行レコードがない場合)。

+0

ありがとうございました! '' org_id =#{org_id}; "'これは、私が動的に異なるidと基底のケースを説明できるようにするために得たものです。(luzz(cumulative_donations_count、1) – HashRocketSyntax

1

カウント列にはNULL値が存在しないと仮定すると、あなたは前の行の値を取得し、現在の行のからそれを減算するlagを使用することができますデルタを得るための値。各グループの最初の行(created_at順)については、差はnullです。私が正しく理解していれば

select org,created_at, 
cumulative_donations_count - lag(cumulative_donations_count) over(partition by org order by created_at) as delta_from_prev_day 
from yourtable