You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:40:30