首页 / 知识

关于Rails:如何计算ROR特定字段中具有唯一值的记录数?

2023-04-13 18:05:00

关于Rails:如何计算ROR特定字段中具有唯一值的记录数?

How can I count the number of records that have a unique value in a particular field in ROR?

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

类似的东西:

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

但是,那似乎不起作用。


在滑轨4中的更改略有变化,现在已弃用:distinct => true。用途:

1
Record.distinct.count('date')

或者如果您想要日期和数字:

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

您要使用的是以下SQL:

1
SELECT COUNT(DISTINCT date) FROM records

ActiveRecord具有以下内置功能:

1
Record.count('date', :distinct => true)

SQL之外:

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

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


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

所以我达到了

的要求

1
Record.count('DISTINCT date')

详细说明答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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表拉入内存只是为了回答计数。)


字段计算日期记录

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢