【问题标题】:Order by field A, and stopping only when field A changes after a certain limit按字段A排序,只有当字段A在一定限度后发生变化时才停止
【发布时间】:2014-06-20 05:25:06
【问题描述】:

我有一张用户表,表中的一个字段是公司。

我每天处理一定数量的用户,所以我使用limit(x)。我按公司对它们进行排序,并希望确保我的限制在公司更改时结束。我不想让来自一家公司的用户得到处理,而另一家则没有。但我想每天处理最少数量的用户,而不是公司数量。

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

目前将在此处拆分

AAAB][BCCC -> 不好(我处理了来自 B 的 1 个用户,而另一个未处理)

我想让公司 A 的所有用户 + 公司 B 的所有用户。

AAABB][CCC -> 好

我只想使用限制作为在这种情况下处理的最小用户数。

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

最好的方法是什么(最好是 1 个简单的 SQL 语句)? ActiveRecord 语法的加分项

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

【问题讨论】:

  • 你使用什么类型的sql? (PostgreSQL、MySQL 等)
  • 没时间解决,我正在使用 ActiveRecord,需要先搜索 rank 的工作原理(就像这个想法,不确定字符串的性能排名,我有很多记录。

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


【解决方案1】:

您可以在子查询中对公司使用排名(窗口函数)。

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

    选择 * 来自 ( select *, DENSE_RANK() over(order by company) as kr 来自用户 ) 标签 其中 kr

可能会优化

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 2021-01-15
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多