Rails + ActiveRecords:如何按日期对记录进行分组并根据条件显示其计数?

时间:2016-04-03 16:06:58

标签: mysql ruby-on-rails ruby activerecord group-by

我在数据库表中有这样的数据

ID | numbers | created_at
1  |   10    | 2016-04-01
2  |   20    | 2016-04-01 
3  |   -8    | 2016-04-01
4  |    1    | 2016-04-02
5  |   81    | 2016-04-03
6  |  -12    | 2016-04-03
7  |    0    | 2016-04-03

我希望获得所需的输出:

Date       | Greater (or even) than 0 | Smaller than 0
2016-04-01 | 2                        | 1 
2016-04-02 | 1                        | 0
2016-04-03 | 2                        | 1 

有没有办法从一个查询加载这些数据? 我只能想到我们的子查询,并在Rails视图中进行查询,我想要渲染所获取的数据。

2 个答案:

答案 0 :(得分:0)

我会尝试这样的事情:

lines = Model.
  select('date, SUM(IF(number > 0, 1, 0)) as greater_count', SUM(IF(number < 0, 1, 0)) as smaller_count').
  group(:date).
  order(:date)

lines.each do |line|
  puts [line.date, line.greater_count, line.smaller_count]
end

答案 1 :(得分:0)

假设您的Created_at是一个没有时间组件的日期......类似于spickermann,但更少的平台特定。

Select Created_at as Date
     , Sum(case WHEN numbers >= 0 THEN 1 Else 0 END) as GTE_0
     , Sum(case WHEN numbers < 0 THEN 1 Else 0 END) as LT_0
FROM Table
GROUP BY Created_at

这样做是评估数字,如果&gt; = 0然后它设置值1,然后它按日期求和大于等于0(GTE_0)类似于LT_0(小于0)。