programing tip

ROR의 특정 필드에 고유 한 값이있는 레코드 수를 어떻게 계산할 수 있습니까?

itbloger 2020. 11. 19. 07:55
반응형

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 는 필수 불가결합니다.


최신 #counton 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 테이블을 메모리로 가져 와서 계산에 응답합니다.)

참고 URL : https://stackoverflow.com/questions/36608/how-can-i-count-the-number-of-records-that-have-a-unique-value-in-a-particular-f

반응형