ROR의 특정 필드에 고유 한 값이있는 레코드 수를 어떻게 계산할 수 있습니까?
날짜 필드가 포함 된 레코드 세트가 있으며 레코드 세트에 표시되는 고유 날짜 수를 확인하려고합니다.
다음과 같은 것 :
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)
SQL 외부 :
Record.find(:all).group_by(&:date).count
ActiveSupport의 Enumerable # group_by 는 필수 불가결합니다.
최신 #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)
에서 다른 답변에서 언급 한 것처럼 (이 질문과 SO의 다른 곳에서) 실제로 DISTINCT
쿼리에 추가 로 이어질 것입니다 .
SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...
실제로해야 할 일은 SQL 문자열을 직접 사용하는 것입니다.
(...).count("DISTINCT user_id")
이는 우리에게
SELECT COUNT(DISTINCT user_id) FROM ...
또한 db의 필드에 인덱스가 있는지 확인하십시오. 그렇지 않으면 해당 쿼리가 빠르게 느려질 것입니다.
(SQL에서이 작업을 수행하는 것이 훨씬 낫습니다. 그렇지 않으면 전체 db 테이블을 메모리로 가져 와서 계산에 응답합니다.)
'programing tip' 카테고리의 다른 글
전체 단어를 고려하여 문자열에서 처음 100 자 가져 오기 (0) | 2020.11.19 |
---|---|
Spring restTemplate을 사용한 REST API의 기본 인증 (0) | 2020.11.19 |
ModelState.IsValid가 실패하면 오류 메시지가 표시됩니까? (0) | 2020.11.19 |
NSString에 대한 열거 형 값 (iOS) (0) | 2020.11.19 |
mongodb 서비스가 시작되지 않습니다 (0) | 2020.11.19 |