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
相关产品推荐
相关产品推荐

