【问题标题】:Count of records that are created the same day同一天创建的记录数
【发布时间】:2012-02-27 15:50:18
【问题描述】:

我正在尝试创建一个应该是这样的数组:

[ [created_at date * 1000, count record for that date],
  [created_at date * 1000, count record for that date], 
  [created_at date * 1000, count record for that date] ]

created_at 日期不完全相同,因为分钟、小时和秒。 我在想是否可以将 created_at time on create 更改为 00:00:00

这个我试过了,

@kliks = Klik.all.map{|klik| [(klik.created_at.to_i * 1000), 1]}

但我还没有想出将同一天创建的那些记录相加。此外,此循环为每条记录创建一个数组,我不希望总和重复。

【问题讨论】:

    标签: sql ruby-on-rails ruby ruby-on-rails-3 activerecord


    【解决方案1】:

    Rails 有ActiveRecord::Calculations,它旨在在数据库级别执行此类操作。你应该使用它。在这种情况下,count 是您想要的方法:

    @kliks = Klik.count( :group => "DATE( created_at )" )
    

    这相当于下面的 SQL:

    SELECT *, COUNT(*) FROM kliks
    GROUP BY DATE( created_at )
    

    DATE() 函数是 MySQL 将日期时间(如 created_at,例如 2012-02-27 10:08:59)更改为普通日期(例如 2012-02-27)。无需将事物转换为整数或乘以分钟和秒,也无需使用 map 或 Ruby 中的任何其他方法。

    【讨论】:

    • 我的数据库中有 kliks,并且数组遵循您的代码:[[1330285888000, 1], [1330296432000, 1], [1330354931000, 1]]。其中两个 klik 是在同一天创建的。因此应该只有 2 个数组。 DATE 函数似乎也无法正常工作。
    • @Jordan 我认为乘法是必要的,因为 OP 可能试图将日期表示为自 1970 年以来的毫秒数,以便在 JS 中为现有绘图库创建一个 Date 对象(如浮子)。 [但是,这与按日期分组和计数的原始问题是分开的。]
    • 我让它工作了它只是一个哈希而不是一个数组。 {"2012-02-26"=>2, "2012-02-27"=>5}
    • 日期也应该以毫秒为单位。
    • 我确实采用了这个解决方案:@kliks = Klik.count( :group => "DATE( created_at )" ).map{|k, v| [(Time.parse(k).to_i * 1000), v] }
    【解决方案2】:

    根据query guide,你应该试试

    items = Klik.select("date(created_at) as creation_date, count(*) as count").group("date(creation_date)")
    result = items.map { |k| [ k['creation_date'], k['count'] ] }
    

    【讨论】:

    • +1 解决方案确实使用了计数方法和我发现更干净的组。
    【解决方案3】:

    以下将产生您要求的结果:

    Klik.all.group_by do |k|
      k.created_at.beginning_of_day
    end.map do |date, records|
      [date, records.length]
    end
    

    【讨论】:

    • 请注意,这可能效率较低,将完整数据从 SQL 服务器传输到 Ruby,然后进行分组和计数,而不是在 RDBMS 本身上执行这些操作。
    • 我同意!我会同意乔丹的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2023-04-08
    • 2014-05-08
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多