【问题标题】:Find correct bucket for the number为数字找到正确的存储桶
【发布时间】:2022-08-22 01:44:28
【问题描述】:

我有一个具有不同3-3-4 的存储桶,我需要为该号码找到正确的存储桶

1-3 4-6 7-10 11-13 14-16 17-20 21 - 23 24 - 26 27 - 30

找到正确存储桶的有效公式可能是什么,例如 5 号位于存储桶 4-6 中,18 位于存储桶 17-20 中。

需要为此编写sql查询

  • 数字有多大(例如您的示例中的 1..30)?如果不是太大,请预先填充查找表。

标签: sql algorithm math


【解决方案1】:

我会维护一个包含范围值的单独真实表。然后,加入它以获得您想要的输出。

Table: ranges
start | end
1     | 3
4     | 6
7     | 10
11    | 13
14    | 16
17    | 20
21    | 23
24    | 26
27    | 30

WITH buckets AS (
    SELECT 5 AS val UNION ALL
    SELECT 18
)

SELECT b.val, CAST(r.start AS VARCHAR(10)) + '-' + CAST(r.end AS VARCHAR(10))
FROM buckets b
INNER JOIN ranges r
    ON b.val BETWEEN r.start AND r.end
ORDER BY b.val;

【讨论】:

    【解决方案2】:

    对于不重叠的范围,您只需要每个范围的起始值(或等效地,结束)。然后索引该列。那么这是非常有效的:

    SELECT ...
        FROM ...
        WHERE n >= ?
        ORDER BY n
        LIMIT 1
    

    由于 INDEX,这在 O(1) 中运行。 (或者 O(logN) 如果包括 BTree 查找的成本。)

    更多详细信息(以 IP 地址表示):http://mysql.rjweb.org/doc.php/ipranges

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2021-03-28
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 2022-01-14
      • 2021-04-06
      • 1970-01-01
      相关资源
      最近更新 更多