求SQL自增整数对应的行星环数:最近累加和计算公式
计算自增ID对应的行星环数
这问题其实是个经典的数学推导题,咱们先把逻辑理清楚,再给出能直接用在SQL里的解决方案。
问题核心分析
首先明确规则:第k环恰好放置k颗行星,前k环的总行星数是三角数,公式为:S(k) = k*(k+1)/2
比如前3环总共有3*4/2=6颗行星,对应ID范围是1-6,其中第3环包含ID4-6。
我们要找的是:给定自增IDx,找到最小的整数k,满足S(k-1) < x ≤ S(k)——这个k就是x所在的环数。
公式推导
把上述条件转化为不等式:
(k-1)k/2 < x ≤ k(k+1)/2
对左边的不等式整理成二次方程求解,最终可以推导出k的表达式:k = ceil( (sqrt(8*x + 1) - 1)/2 )
简单解释下:
8*x+1是为了把二次方程转化为完全平方形式的关键项- 开根号后减1再除以2,得到的结果如果是整数,说明
x正好是某环的最后一颗行星;如果是小数,向上取整就得到对应的环数
SQL实现
不同数据库的函数写法略有差异,但核心逻辑一致,直接套用公式即可:
- MySQL/PostgreSQL:
SELECT id, CEIL( (SQRT(8 * id + 1) - 1) / 2 ) AS ring_number FROM your_table; - SQL Server:
SELECT id, CEILING( (SQRT(8 * id + 1) - 1) / 2 ) AS ring_number FROM your_table; - Oracle:
SELECT id, CEIL( (SQRT(8 * id + 1) - 1) / 2 ) AS ring_number FROM your_table;
示例验证
用几个典型ID测试下公式的正确性:
- ID=1:
(sqrt(9)-1)/2=(3-1)/2=1→ ceil(1)=1 ✔️(第1环) - ID=3:
(sqrt(25)-1)/2=(5-1)/2=2→ ceil(2)=2 ✔️(第2环最后一颗) - ID=4:
(sqrt(33)-1)/2≈2.37→ ceil(2.37)=3 ✔️(第3环第一颗) - ID=10:
(sqrt(81)-1)/2=(9-1)/2=4→ ceil(4)=4 ✔️(第4环最后一颗) - ID=11:
(sqrt(89)-1)/2≈4.216→ ceil(4.216)=5 ✔️(第5环第一颗)
小提示
如果遇到超大ID导致浮点数精度问题,可以给8*x+1加一个极小的偏移量(比如1e-6)来避免取整错误,比如:CEIL( (SQRT(8 * id + 1 + 1e-6) - 1)/2 )
不过常规业务场景下,这个额外处理大多不需要。
内容的提问来源于stack exchange,提问作者Connor Glasgow
相关产品推荐
相关产品推荐

