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

MySQL查询判断c1列行值是否介于c2列当前行与下一行值之间

MySQL逐行区间校验实现方案

需求逻辑

逐行校验第x行c1列的数值,是否落在第x行c2列值与第x+1行c2列值构成的闭区间内。
示例表原始数据:

C1    || C2  || 
---------------
2     || 1   || 
5     || 3   || 
6     || 4   || 
7     || 5   || 

上述示例的预期返回结果为2:第1行c1值为2,恰好落在第1行c2值1、第2行c2值3构成的区间范围内。

实现说明

  • MySQL 8.0及以上版本直接使用LEAD()窗口函数取下一行数据,写法简洁性能更好
  • 区间判断用LEAST()和GREATEST()兼容c2当前行值大于/小于下一行值两种情况,不需要额外写大小判断分支
  • 最后一行没有对应的下一行数据,自动过滤不参与校验
  • 注意:关系数据库表无内置固定行序,如果业务有明确排序规则(如按自增ID、创建时间排序),请将代码中ORDER BY (SELECT 1)替换为对应排序字段,否则行序不确定会导致结果错误

对应查询代码

MySQL 8.0+ 版本(推荐)

WITH line_data AS (
    SELECT
        c1,
        c2,
        LEAD(c2) OVER (ORDER BY (SELECT 1)) AS next_c2
    FROM `your_table` -- 替换为实际表名
)
SELECT c1
FROM line_data
WHERE next_c2 IS NOT NULL
AND c1 BETWEEN LEAST(c2, next_c2) AND GREATEST(c2, next_c2);

MySQL 5.x 版本(无窗口函数兼容写法)

SELECT t1.c1
FROM (
    SELECT
        c1,
        c2,
        @row_num1 := @row_num1 + 1 AS rn
    FROM `your_table`, (SELECT @row_num1 := 0) init
    ORDER BY (SELECT 1) -- 有排序字段替换此处
) t1
INNER JOIN (
    SELECT
        c2,
        @row_num2 := @row_num2 + 1 AS rn
    FROM `your_table`, (SELECT @row_num2 := 0) init
    ORDER BY (SELECT 1) -- 有排序字段替换此处
) t2 ON t1.rn + 1 = t2.rn
WHERE t1.c1 BETWEEN LEAST(t1.c2, t2.c2) AND GREATEST(t1.c2, t2.c2);

结果验证

针对提供的示例表执行上述SQL,返回结果如下,完全符合预期:

c1
---
2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:03:26