English 中文(简体)
如何计算ROR中特定字段中具有唯一值的记录数?
原标题:
  • 时间:2008-08-31 03:19:33
  •  标签:

我有一个包含日期字段的记录集,希望确定记录集中表示的唯一日期数。

类似于:

Record.find(:all).date.unique.count 

但当然,这似乎并不奏效。

最佳回答

您想要的是以下SQL:

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord内置了以下内容:

Record.count( date , :distinct => true)
问题回答

这在轨道4及以上版本中略有变化:distinct=>;true现在已被弃用。使用:

Record.distinct.count( date )

或者,如果您想要日期和号码:

Record.group(:date).distinct.count(:date)

SQL之外:

Record.find(:all).group_by(&:date).count

活动支持可枚举的#group_by是必不可少的。

the latest #count on rails source code only accept 1 parameter. see: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

所以我通过

Record.count( DISTINCT date )

详细说明答案:

Post.create(:user_id => 1, :created_on =>  2010-09-29 )
Post.create(:user_id => 1, :created_on =>  2010-09-29 )
Post.create(:user_id => 2, :created_on =>  2010-09-29 )
Post.create(:user_id => null, :created_on =>  2010-09-29 )

Post.group(:created_on).count
# => { 2010-09-29  => 4}

Post.group(:created_on).count(:user_id)
# => { 2010-09-29  => 3}

Post.group(:created_on).count(:user_id, :distinct => true) # Rails <= 3
Post.group(:created_on).distinct.count(:user_id) # Rails = 4
# => { 2010-09-29  => 2}

正如我提到的此处,在Rails 4中,使用其他答案中提到的(…).uniq.count(:user_id)(针对这个问题和SO上的其他地方),实际上会导致查询中出现额外的DISTINCT

从中选择DISTINCT COUNT(DISTINCT user_id)

我们实际要做的是自己使用SQL字符串:

(…).count(“DISTINCT user_id”)

这给了我们:

从中选择计数(DISTINCT user_id)

此外,请确保您在数据库中的字段上有一个索引,否则该查询将很快变为sloooow。

(在SQL中这样做要好得多,否则您只需将整个数据库表拉入内存来回答计数。)





相关问题