65

我有一个包含日期字段的记录集,并且想确定记录集中表示了多少个唯一日期。

就像是:

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

但当然,这似乎行不通。

4

7 回答 7

118

这在 rails 4 和更高版本中略有变化,:distinct => true现在已弃用。采用:

Record.distinct.count('date')

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

Record.group(:date).distinct.count(:date)
于 2013-10-14T14:14:04.770 回答
84

你要的是以下 SQL:

SELECT COUNT(DISTINCT date) FROM records

ActiveRecord 内置:

Record.count('date', :distinct => true)
于 2008-08-31T03:52:26.200 回答
16

SQL 之外:

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

ActiveSupport 的Enumerable#group_by是必不可少的。

于 2008-09-02T18:52:17.063 回答
15

最新#count的 Rails 源代码只接受 1 个参数。见:http ://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

所以我通过

Record.count('DISTINCT date')
于 2017-06-21T08:51:51.920 回答
10

详细回答:

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}
于 2014-07-23T14:59:37.093 回答
9

正如我在这里提到的,在 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 ...

于 2015-10-12T20:04:57.820 回答
2

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

(最好在 SQL 中执行此操作,否则您将整个 db 表拉入内存只是为了回答计数。)

于 2008-09-16T12:14:02.520 回答