【问题标题】:Convert long SQL query into ActiveRecord expression将长 SQL 查询转换为 ActiveRecord 表达式
【发布时间】:2019-03-28 02:38:05
【问题描述】:

我需要将下面的 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、statistic_id、value、year 属性。 ActiveRecord 查询旨在获取每个城市和统计数据的最近几年的统计值,并返回一个ActiveRecord::Relation 对象。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    根据我对所提供的 SQL 查询的理解,您正在尝试为每对唯一的 (city_id, statistic_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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2020-10-25
      相关资源
      最近更新 更多