按字段A排序,仅在字段A在特定限制后更改时停止

时间:2014-06-20 05:25:07

标签: sql activerecord ruby-on-rails-3.2

我有一个用户表,桌面上有一个字段是公司。

我每天都在处理一定数量的用户,所以我使用limit(x)。我按公司对它们进行排序,并希望确保我的限制在公司变更时结束。我不希望处理来自一家公司的用户而不处理其他公司的用户。但我想每天处理最少数量的用户,而不是许多公司。

例如,如果我有来自公司A的3个用户,来自公司B的2个用户,来自公司C的3个用户,并且限制为4(最低要处理)

目前会分裂

AAAB] [BCCC - >不好(我有一个用户来自B处理,另一个没有处理)

我希望公司A的所有用户都来自公司B的所有用户。

AAABB] [CCC - >好

我只想在这种情况下使用limit作为最小用户数。

我目前有User.order(更低('公司'))。限制(4 + 10)并循环通过每个公司,以便在达到我的实际限制(4)后公司更改时停止但是如果有超过10个用户的公司。此外,这只是一个非常糟糕的解决方案。

最好的方法是什么(理想情况下,在一个简单的SQL语句中)? ActiveRecord语法的加分点

值得注意的是,我的数据库中有10'000行。

1 个答案:

答案 0 :(得分:0)

您可以在子查询中使用公司的排名(窗口功能)。

  1. 找到第4行(子查询)的等级。
  2. 选择排名小于或等于第4行排名的行(主查询)。

    选择*来自 ( 选择*,DENSE_RANK()(按公司排序)为kr 来自用户 ) 标签 其中kr <= ( 从用户LIMIT 1 OFFSET 4中选择DENSE_RANK()(按公司排序)为kr )

  3. 可能会被优化