ROR의 특정 필드에 고유한 값이 있는 레코드 수를 어떻게 계산할 수 있나요?
-
09-06-2019 - |
문제
날짜 필드를 포함하는 레코드 세트가 있고 레코드 세트에 표시되는 고유 날짜 수를 확인하고 싶습니다.
다음과 같은 것 :
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)
최신 #count
온 레일 소스 코드에서는 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 ...
또한 DB의 필드에 인덱스가 있는지 확인하십시오. 그렇지 않으면 해당 쿼리가 빠르게 느려질 것입니다.
(SQL에서 이 작업을 수행하는 것이 훨씬 낫습니다. 그렇지 않으면 개수에 응답하기 위해 전체 DB 테이블을 메모리로 끌어옵니다.)