【问题标题】:with activerecord how can I select records based on the highest value of a field?使用 activerecord 如何根据字段的最大值选择记录?
【发布时间】:2010-11-19 05:42:15
【问题描述】:

我遇到了一些我不知道如何处理活动记录的事情(实际上我不能确切地说如何使用 sql 来完成)我想做的事情。我想根据某个字段的最高值以及其他一些标准来选择记录。下面是一些解释我的情况的伪内容。给定以下记录:

id:1 | name:recipe1 | saved:true  | revision:1
id:2 | name:recipe1 | saved:false | revision:2
id:3 | name:recipe1 | saved:true  | revision:3
id:4 | name:recipe1 | saved:false | revision:4
id:5 | name:recipe2 | saved:true  | revision:1
id:6 | name:recipe2 | saved:true  | revision:2
id:7 | name:recipe3 | saved:false | revision:1
id:8 | name:recipe4 | saved:true  | revision:1

我希望能够获取已保存的修订号最高的记录。这意味着 ID 为 3、6 和 8 的记录

我的第一直觉是做某种子查询,在修订或其他东西上获得 MAX。除此之外,我真的不知道如何去做,所以任何帮助将不胜感激。

编辑:

这是执行我想要的 sql:

SELECT id, name, MAX(revision) as "revision" FROM revisions WHERE saved = 1 GROUP BY name

现在,有什么合理的方法可以用 ActiveRecord 做到这一点?

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:
    Revision.maximum(:revision,:conditions => ["saved=1"],:group => 'name')
    

    【讨论】:

    • 这正在返回几乎存在的 id 和最高修订版(如:{33=>4}),但有什么办法让它返回记录?
    • Revision.find(:all,:select => "id,name,max(revision) as revision", :conditions => ["saved=1"],:group => 'name ')
    【解决方案2】:

    使用 CTE 的 ROW_NUMBER() 函数 OVER (PARTITIONED BY recipe1 ORDER BY revision)。

    更多详情请访问此页面:

    http://blog.sqlauthority.com/2009/08/08/sql-server-multiple-cte-in-one-select-statement-query/

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 2015-08-12
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多