我有一个包含日期字段的记录集,并且想确定记录集中表示了多少个唯一日期。
就像是:
Record.find(:all).date.unique.count
但当然,这似乎行不通。
我有一个包含日期字段的记录集,并且想确定记录集中表示了多少个唯一日期。
就像是:
Record.find(:all).date.unique.count
但当然,这似乎行不通。
这在 rails 4 和更高版本中略有变化,:distinct => true
现在已弃用。采用:
Record.distinct.count('date')
或者,如果您想要日期和号码:
Record.group(:date).distinct.count(:date)
你要的是以下 SQL:
SELECT COUNT(DISTINCT date) FROM records
ActiveRecord 内置:
Record.count('date', :distinct => true)
最新#count
的 Rails 源代码只接受 1 个参数。见: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
的内容:
SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...
我们实际上要做的是自己使用一个 SQL 字符串:
(...).count("DISTINCT user_id")
这给了我们:
SELECT COUNT(DISTINCT user_id) FROM ...
另外,请确保您在数据库中的字段上有一个索引,否则该查询将很快变得缓慢。
(最好在 SQL 中执行此操作,否则您将整个 db 表拉入内存只是为了回答计数。)