我有一种情况,我只需要从一个特定的活动记录查询响应中提取几个记录。
@annotations = Annotations.select('*', ROW_NUMBER() OVER (PARTITION BY column_a) ORDER BY column_b)
上面是一个查询,其中@annotations
是活动记录响应,我想在它上面应用下面的逻辑。有没有更好的方法用rails的方式编写下面的逻辑?
with some_table as
(
select *, row_number() over (partition by column_a order by column_b) rn
from the_table
)
select * from some_table
where (column_a = 'ABC' and rn <= 10) or (column_b <> 'AAA')
1条答案
按热度按时间pod7payv1#
ActiveRecord在其高级API中不提供CTE;但是,只要稍微使用Arel,我们就可以将其作为FROM子句中的子查询
结果将是
Annotation
对象的集合,这些对象使用您的CTE和您描述的过滤器。SQL语句:
备注:
row_number() over (partition by column_a order by column_b)
转换为Arel,但它似乎与这个问题无关。