2017-02-28 59 views
0

我目前有一張圖表顯示了一天中的累積總數,但我真正所追求的是那一天的邊際增長(即delta)。這怎麼可以通過查詢完成?不幸的是,API的累計總量是可用的。根據rails中的created_at:條件減去兩行

這裏是我的表:

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需要進行比較的記錄數,有一個基本案例if <= 1,應該返回nil。很顯然,created_at:值不會在毫秒內完全落後1天。

可以說,也有類似的問題,但這個例子的條件很簡單,對許多讀者有用。

UPDATE - 預期輸出

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

+1

您是否也可以顯示預期的輸出? –

+0

謝謝。更新以顯示預期。 – HashRocketSyntax

回答

2

如果我理解正確的話,那麼你會在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。第二個參數是要返回的記錄數。第三個是第一個記錄的值(當沒有前面的記錄時)。

+0

謝謝! 'lag(cumulative_donations_count,1)over(partition by org_id ... where org_id =#{org_id};「'得到了這個工作方式,我可以動態地解釋不同的id和基本情況 – HashRocketSyntax

1

假設有在數列,可以使用lag獲得先前行的值和當前行的減去它沒有空值價值來獲得三角洲。對於每個組的第一行(由created_at排序),差異將爲null。 (如果需要在lag您可以使用0默認值)

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