0

나는 요구했다 : 나는 SQL액티브 AVG 계산

SELECT AVG(desired) AS desired 
FROM model 
GROUP BY p_id 

실행할 때

Model.group(:p_id).pluck("AVG(desired)") 
=> [0.77666666666666667e1, 0.431666666666666667e2, ...] 

을하지만 난

----------------- 
|  desired | 
|-----------------| 
| 7.76666666666667| 
|43.1666666666667 | 
|  ...  | 
----------------- 

이것의 이유는 무엇입니까

있어? 물론, 나는 번식 할 수 있지만, 어디에서 설명해야하는지 배웠다.

Model.group(:p_id).pluck("p_id, AVG(desired)") 

방법이 경우에 올바른 AVG 값을 얻기 위해 내 요청이 그래서

내가

Model.group(:p_id).pluck("AVG(desired)").map{|a| a.to_f} 
=> [7.76666666666667,43.1666666666667, ...] 

가 지금은 다른 작업과 투쟁 해요 발견, 나는 번호가 뽑은 속성 필요 ?

답변

2

0.77666666666666667e1들이 약간 다른 정밀도 두 개의 서로 다른 표현에 같은 수있어, (거의) 7.76666666666667입니다. 당신이 irb에 첫 번째 덤프 경우, 당신은 볼 수 있습니다 :

> 0.77666666666666667e1 
=> 7.766666666666667 

데이터베이스에 avg을 수행 할 때, 그 결과는 액티브 루비의 BigDecimal를 사용하여 나타내는 numeric을 입력있다. BigDecimal 값은 과학 표기법으로 표시되지만 표시 할 데이터의 형식을 지정할 때 차이가 없어야합니다. 어떤 경우

, pluck이 작업에 적합한 도구가 아닙니다, 당신은 average를 사용하려면 :
Model.group(:p_id).average(:desired) 

당신에게 평균에 p_id 매핑하는 해시를 줄 것이다. 평균은 여전히 ​​ BigDecimal s입니다.하지만 문제가되지는 않습니다. @

+0

뮤 - 인 - 투 - 짧은 이 답변 주셔서 감사합니다, 그것은 좋은 설명하지만 여기서 두 가지이다 : 나는 아직도 내가 6가 원인 뽑은 사용할 필요가 BigDecimal를 2와 1. 코드를 반환 해시 다른 분야의 다른 계산. –

+0

하지만 BigDecimal의 문제점은 무엇입니까? –

0

마지막으로 내가 찾은 솔루션 :

Model.group(:p_id).pluck("p_id, AVG(Round(desired))") 
=> [[1,7.76666666666667],[2,43.1666666666667], ...]