Rails Active Record-获取均匀分布的任意数量的记录

时间:2018-09-11 12:17:54

标签: sql ruby-on-rails activerecord

我想在我的Rails App上查询,以返回均匀分布的任意数量的记录。

这是什么意思,如果我的查询返回100条记录,而我只想要4条记录,则它应该返回记录100、75、50和25。 如果我要5,则应返回100、80、60、40、20。

我知道我可以在结果之后处理数组,但是我的问题是,有没有一种方法可以直接使用ActiveRecord甚至SQL?

2 个答案:

答案 0 :(得分:1)

如果您使用的是Postgresql,mssql或oracle,则可以使用row_number()函数,但是看起来您将需要两个嵌套查询,这可能比您想的要复杂。有关构造方法的示例,请参见Return row of every n'th record

从那里开始,您想要做的事情可能像这样:

MyModel.find_by_sql("
   select * from my_models where id in (
     SELECT t.id
     FROM
     (
         SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS rownum
         FROM my_models
         WHERE [YOUR CONDITIONS HERE]
     ) AS t
     WHERE t.rownum % n = 0
     ORDER BY t.key
   )")

从这里很难说出查询的价格是多少。如果我可以提供一些建议,我真的建议您在尝试进行这种优化之前,先证明您在使用Rails方式时遇到性能问题。

您可以避免使用ids method of an AREL query object仅获取ID来获取和反序列化要跳过的所有记录的情况,

class MyModel < ActiveRecord::Base
  class < self
    def get_each_n_of_query(n)
      all_ids = get_query.ids
      ids = (0... all_ids.length).select{ |x| x%n == n-1 }.map { |y| all_ids[y] }
      where(id: ids)
    end

    def get_query()
      where(foo: 'bar', ...)
    end
  end
end

How do you select every nth item in an array?处获得答案,以了解如何划分ID列表。

答案 1 :(得分:0)

我可能误读了这个问题,但我试图解决一个类似的问题并使用了:

SELECT DISTINCT [column]
FROM [table]
ORDER BY [column] [DESC|ASC]
OFFSET @Row-1 ROWS --you send @Row a row value if you want to start on Nth row down e.g. 10 to start at row 10
FETCH NEXT @Rows ROWS ONLY --the number of rows you want to see