#ruby-on-rails
#ruby-on-rails
Вопрос:
Мне нужно преобразовать приведенный ниже SQL-запрос в выражение запроса active record. Я наткнулся на ряд связанных сообщений, которые предполагают объединение двух разных моделей с помощью .joins()
но в этом случае я объединяю модель с подмножеством самой себя. В частности, я не смог найти, как выразить SELECT a.some_column, ... FROM my_model a
SELECT a.city_id, a.statistic_id, a.value, a.year
FROM city_values a
INNER JOIN (
SELECT city_id, statistic_id, MAX(year) AS year
FROM city_values
GROUP BY city_id, statistic_id) b
ON a.city_id = b.city_id AND a.year = b.year and a.statistic_id =
b.statistic_id
ORDER BY city_id, statistic_id;
У меня есть модель с именем CityValue, соответствующая данным для различных городов, статистики и лет. Модель имеет атрибуты city_id, statistic_id, значение, год. Запрос ActiveRecord предназначен для получения статистических значений за последние годы для каждого города и статистики и возврата ActiveRecord::Relation
объекта.
Ответ №1:
Насколько я понимаю предоставленный SQL-запрос, вы пытаетесь выбрать строки, содержащие статистику за последний год для каждой уникальной пары (city_id, statistic_id).
Я бы не стал использовать join для решения этой проблемы. cvs
означает city_values
.
CityValue.
select('DISTINCT ON (cvs.city_id, cvs.statistic_id), cvs.*').
order('cvs.city_id, cvs.statistic_id, cvs.year DESC')
Пояснения о DISTINCT ON
можно найти здесь:
https://www.vertabelo.com/blog/technical-articles/postgresql-select-distinct-on .