Конвертировать длинный SQL-запрос в выражение ActiveRecord - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно преобразовать приведенный ниже SQL-запрос в выражение запроса активной записи. Я сталкивался с рядом связанных постов, которые включают в себя объединение двух разных моделей с использованием .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, statistics_id, значение, год. Запрос ActiveRecord предназначен для получения значений статистики за последние годы для каждого города и статистики и возврата объекта ActiveRecord::Relation.

1 Ответ

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

Из моего понимания предоставленного SQL-запроса вы пытаетесь выбрать строки, содержащие статистику за последний год для каждой уникальной пары (city_id, statistics_id).

Я бы не использовал соединение для этой проблемы. 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.

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