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

SQL实现两数值区间就近取整(取下边界值)的查询编写需求

等级匹配SQL实现方案

前提假设

你的数据表命名为level_mapping,包含两个字段:

  • boundary_val:数值类型,存储各等级对应的边界值(原数据中的逗号统一替换为小数点存储,例如34,14改为34.14)
  • level:字符串类型,存储边界值对应的等级,例如A+、A++

用户输入的待匹配数值用变量@input_val表示,本次示例取值为34.26

实现SQL(兼容MySQL 8.0+/PostgreSQL/SQL Server等支持CTE的数据库)

-- 赋值用户输入值
SET @input_val = 34.26;

WITH 
-- 取上边界:大于输入值的最小边界及对应等级
upper_bound AS (
    SELECT boundary_val, level 
    FROM level_mapping 
    WHERE boundary_val > @input_val 
    ORDER BY boundary_val ASC 
    LIMIT 1
),
-- 取下边界:小于输入值的最大边界及对应等级
lower_bound AS (
    SELECT boundary_val, level 
    FROM level_mapping 
    WHERE boundary_val < @input_val 
    ORDER BY boundary_val DESC 
    LIMIT 1
)
SELECT 
    CASE
        -- 输入值小于所有边界,直接返回最小边界对应等级
        WHEN lower_bound.boundary_val IS NULL THEN upper_bound.level
        -- 输入值大于所有边界,直接返回最大边界对应等级
        WHEN upper_bound.boundary_val IS NULL THEN lower_bound.level
        -- 输入值大于上下边界平均值,返回上边界等级
        WHEN @input_val > (lower_bound.boundary_val + upper_bound.boundary_val)/2 THEN upper_bound.level
        -- 输入值小于等于平均值,返回下边界等级
        ELSE lower_bound.level
    END AS matched_level
FROM lower_bound 
CROSS JOIN upper_bound;

如果你使用的是不支持CTE的低版本数据库,可以把子查询直接放到FROM子句中,逻辑完全一致。

结果验证

针对本次示例:

  • 下边界值为34.14,对应等级A+
  • 上边界值为34.42,对应等级A++
  • 平均值为 (34.14+34.42)/2 = 34.28
  • 输入值34.26小于34.28,最终返回等级A+,符合规则要求

内容的提问来源于stack exchange,提问作者zdnmn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:09:03