Метод группы Rails, выводящий неверное среднее в Postgres - PullRequest
0 голосов
/ 19 марта 2019

У меня есть поисковый запрос (с использованием Postgres), который использует несколько поисковых параметров и собирает среднюю доходность обработок.Проблема, с которой я сталкиваюсь, заключается в том, что среднее количество обработок одинаково для обоих результатов, что неверно.Я не уверен, где я ошибаюсь с этим запросом, но он собирает среднее для всех и выводит один и тот же результат для каждой обработки:

@search = Trial.joins(:region, :property, :quality_datum, treatment_selections: :treatment)
.where("EXTRACT(year from season_year) BETWEEN #{params[:start_year]} AND #{params[:end_year]}")
.where('regions.name': params[:select_region]).where('properties.name': params[:select_property])  
.group('treatments.id')
.select('treatments.name, AVG(quality_data.yield) as yield')

Какие выходные данные:

|    Name     | Average |
| Treatment 1 |   8.68  |       
| Treatment 2 |   8.68  |

Что не так, должно быть:

|    Name     | Average |
| Treatment 1 |   9.27  |       
| Treatment 2 |   7.25  |

Числа Quality_data.yield:

Обработка 1: 9.86, 9.79, 8.16, которыесреднее значение должно = 9,27

Обработка 2: 10,01, 4,89, 6,85, что среднее значение должно = 7,25

Результат запроса:

SELECT treatments.name, AVG(quality_data.yield) as yield FROM "trials" 
INNER JOIN "regions" ON "regions"."id" = "trials"."region_id" 
INNER JOIN "properties" ON "properties"."id" = "trials"."property_id" 
INNER JOIN "treatment_selections" ON "treatment_selections"."trial_id" = "trials"."id" 
INNER JOIN "quality_data" ON "quality_data"."treatment_selection_id" = "treatment_selections"."id" 
INNER JOIN "treatment_selections" "treatment_selections_trials" ON "treatment_selections_trials"."trial_id" = "trials"."id" 
INNER JOIN "treatments" ON "treatments"."id" = "treatment_selections_trials"."treatment_id" WHERE (EXTRACT(year from season_year) BETWEEN 2016 AND 2018) AND "regions"."name" = $1 AND "properties"."name" = $2 GROUP BY treatments.id

Ассоциации

class Trial
  belongs_to :region
  belongs_to :property
  has_many :treatment_selections, dependent: :destroy
  has_many :quality_datum, through: :treatment_selections
end

class TreatmentSelection < ApplicationRecord
  belongs_to :trial
  belongs_to :treatment
  has_many :quality_datum, dependent: :destroy
end

class Treatment < ApplicationRecord
  has_many :treatment_selections
end

class Region < ApplicationRecord
  has_many :trials
end

class Property < ApplicationRecord
  has_many :trials
end

1 Ответ

0 голосов
/ 20 марта 2019

Попробовав несколько решений, в течение нескольких дней у меня было подозрение, что treatments.id и treatment_selections.treatment_id не совпадают, как они должны.

Я изменил запрос на следующий, и, похоже, он работал как следует:

@search = Trial.joins(:region, :property, :quality_datum, :treatment_selections)
.joins('INNER JOIN treatments ON treatments.id = treatment_selections.treatment_id')
.select('treatments.name, AVG(quality_data.yield) as yield') 
.group('treatments.id')
.where("EXTRACT(year from season_year) BETWEEN #{params[:start_year]} AND #{params[:end_year]}")
.where('regions.name': params[:select_region]).where('properties.name': params[:select_property])

Разница в том, что я заставляю ВНУТРЕННЕЕ СОЕДИНЕНИЕ в таблицах treatment и treatment_selection к соответствующим идентификаторам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...