【问题标题】:Rails+ActiveRecords: How to group records by date and show their count based on a condition?Rails + ActiveRecords:如何按日期对记录进行分组并根据条件显示它们的计数?
【发布时间】:2016-04-03 16:06:58
【问题描述】:

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

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 视图中执行查询,我想在其中呈现获取的数据。

【问题讨论】:

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


    【解决方案1】:

    我会尝试这样的:

    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
    

    【讨论】:

      【解决方案2】:

      假设您的 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
      

      它的作用是在 >=0 时评估数字,然后将其设置为 1,然后按日期求和大于等于 0 (GTE_0) 对 LT_0(小于 0)进行类似操作。

      【讨论】:

        猜你喜欢
        • 2015-11-17
        • 1970-01-01
        • 2020-04-08
        • 2021-12-05
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多