我有一个用户表,桌面上有一个字段是公司。
我每天都在处理一定数量的用户,所以我使用limit(x)。我按公司对它们进行排序,并希望确保我的限制在公司变更时结束。我不希望处理来自一家公司的用户而不处理其他公司的用户。但我想每天处理最少数量的用户,而不是许多公司。
例如,如果我有来自公司A的3个用户,来自公司B的2个用户,来自公司C的3个用户,并且限制为4(最低要处理)
目前会分裂
AAAB] [BCCC - >不好(我有一个用户来自B处理,另一个没有处理)
我希望公司A的所有用户都来自公司B的所有用户。
我只想在这种情况下使用limit作为最小用户数。
我目前有User.order(更低('公司'))。限制(4 + 10)并循环通过每个公司,以便在达到我的实际限制(4)后公司更改时停止但是如果有超过10个用户的公司。此外,这只是一个非常糟糕的解决方案。
最好的方法是什么(理想情况下,在一个简单的SQL语句中)? ActiveRecord语法的加分点
值得注意的是,我的数据库中有10'000行。
答案 0 :(得分:0)
您可以在子查询中使用公司的排名(窗口功能)。
选择排名小于或等于第4行排名的行(主查询)。
选择*来自 ( 选择*,DENSE_RANK()(按公司排序)为kr 来自用户 ) 标签 其中kr <= ( 从用户LIMIT 1 OFFSET 4中选择DENSE_RANK()(按公司排序)为kr )
可能会被优化