在Rails中基于created_at:condition减去两行

时间:2017-02-28 14:40:33

标签: sql ruby-on-rails ruby postgresql datetime

我目前有一张图表显示了按日累计的总数,但我真正追求的是当天的边际增长,即增量。怎么能通过查询来完成?不幸的是,累积总量是API提供的所有内容。

这是我的表:

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

采取的步骤 - 我开始通过| date,value |遍历self.where(org: goodwill).pluck(created_at:, donations_count:)数组。试图通过数组中各自的索引值来比较日期,但我们的首席工程师希望它完全通过查询来完成。我还想过添加一个列来显示差异,但我们想对这些值运行许多不同的计算。

对于组织需要的记录数量,if <= 1存在[[2017-02-28, 350],[2017-02-27, 50], [2017-02-26, 150], [2017-02-25, nil]]的基本情况,应该返回nil。显然,created_at:value不会完全落后1天(以毫秒为单位)。

可以说,有类似的问题,但这个例子的条件很简单,对许多读者都有用。

更新 - 预期输出

[pi_home] path = /home/pi writeable = yes guest ok = yes create mask = 0664 directory mask = 0755 force user = pi

2 个答案:

答案 0 :(得分: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}}。第二个参数是要返回的记录数。第三个是第一个记录的值(当没有先前的记录时)。

答案 1 :(得分:1)

假设count列中没有空值,您可以使用lag获取前一行的值,并从当前行的值中减去它以获得delta。对于每个组的第一行(按created_at排序),差异将为null。 (如果需要0

,您可以使用默认值lag
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