Sql Rails活动记录-获得均匀分布的任意数量的记录
我想在我的rails应用程序上进行查询,以返回均匀分布的任意数量的记录 意思是,如果我的查询返回100条记录,而我只需要4条,那么它应该返回记录100、75、50和25。 如果我想要5,它应该返回100,80,60,40,20Sql 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()函数,但看起来您需要两个嵌套查询,这可能比您想要的复杂。有关如何
我知道我可以在结果之后操作数组,但我的问题是,有没有办法直接用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万行左右时,我担心会失去性能。但我认为
行编号()
就足够了:)