如何计算 ROR 中特定字段中具有唯一值的记录数?
-
09-06-2019 - |
题
我有一个包含日期字段的记录集,并且想要确定记录集中代表了多少个唯一日期。
就像是:
Record.find(:all).date.unique.count
但当然,这似乎不起作用。
解决方案
您需要的是以下 SQL:
SELECT COUNT(DISTINCT date) FROM records
ActiveRecord 内置了这个:
Record.count('date', :distinct => true)
其他提示
这在 Rails 4 及更高版本中略有变化 :distinct => true
现已弃用。使用:
Record.distinct.count('date')
或者,如果您想要日期和号码:
Record.group(:date).distinct.count(:date)
最新的 #count
on 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)
正如其他答案中提到的(对于这个问题和其他地方)实际上会导致额外的 DISTINCT
正在查询中:
SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...
我们实际上要做的是自己使用 SQL 字符串:
(...).count("DISTINCT user_id")
这给了我们:
SELECT COUNT(DISTINCT user_id) FROM ...
另外,请确保数据库中的字段有索引,否则查询将很快变得缓慢。
(最好在 SQL 中执行此操作,否则您将整个数据库表拉入内存只是为了回答计数。)
不隶属于 StackOverflow