Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails活动记录-获得均匀分布的任意数量的记录_Sql_Ruby On Rails_Activerecord - Fatal编程技术网

Sql Rails活动记录-获得均匀分布的任意数量的记录

Sql Rails活动记录-获得均匀分布的任意数量的记录,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我想在我的rails应用程序上进行查询,以返回均匀分布的任意数量的记录 意思是,如果我的查询返回100条记录,而我只需要4条,那么它应该返回记录100、75、50和25。 如果我想要5,它应该返回100,80,60,40,20 我知道我可以在结果之后操作数组,但我的问题是,有没有办法直接用ActiveRecord甚至SQL来完成这项工作?如果您使用的是postgresql、mssql或oracle,您可以使用row_number()函数,但看起来您需要两个嵌套查询,这可能比您想要的复杂。有关如何

我想在我的rails应用程序上进行查询,以返回均匀分布的任意数量的记录

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


我知道我可以在结果之后操作数组,但我的问题是,有没有办法直接用ActiveRecord甚至SQL来完成这项工作?

如果您使用的是postgresql、mssql或oracle,您可以使用row_number()函数,但看起来您需要两个嵌套查询,这可能比您想要的复杂。有关如何构造它的示例,请参见

从这里开始,您要做的可能是:

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的方式进行操作存在性能问题

通过使用仅获取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
classmymodel

关于如何划分ID列表的问题,请参见上的答案。

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

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

您可以在SQL中使用模运算符。我会尝试找到一个合适的解决方案,并将其发布在评论中。嘿@tyler。谢谢你的回答。我今天要试一试。我试图检查是否可以避免的是,查询大量记录,然后才选择我想要的记录。当一个查询达到50万行左右时,我担心会失去性能。但我认为
行编号()
就足够了:)