SQL Server如何查询与指定地质编码区间重合的样本区间
区间重叠查询修正方案
判断两个闭区间 [a1, a2]、[b1, b2] 存在重叠的通用条件非常简单,只需要满足:
a1 <= b2 AND b1 <= a2
如果业务规则里端点重合不算重叠,把<=替换为<即可。
原有查询的问题
你之前的判断条件只覆盖了端点相等、完全包含两种场景,漏掉了交叉部分重叠的情况,比如编码区间是[2,6],样本区间是[3,9],既没有端点相等,也没有互相包含,但明显存在重叠段[3,6],就会被原有条件漏掉。
修正后的查询语句
SELECT * FROM codes INNER JOIN samples ON codes.hole_id = samples.hole_id WHERE codes.code = 'VBv' AND samples.depth_from <= codes.depth_to AND codes.depth_from <= samples.depth_to;
逻辑验证
拿你给出的示例数据测试:
- 编码VBv的区间是[2,6]
- 样本OP0051780的区间是[1,3]:1<=6、2<=3,满足条件,重叠段为[2,3]
- 样本OP0051781的区间是[3,9]:3<=6、2<=9,满足条件,重叠段为[3,6]
两个样本都会被正确查询到,覆盖所有重叠场景。如果需要额外返回重叠的长度,可以扩展SELECT字段:
SELECT *, LEAST(codes.depth_to, samples.depth_to) - GREATEST(codes.depth_from, samples.depth_from) AS overlap_length FROM codes INNER JOIN samples ON codes.hole_id = samples.hole_id WHERE codes.code = 'VBv' AND samples.depth_from <= codes.depth_to AND codes.depth_from <= samples.depth_to;
内容的提问来源于stack exchange,提问作者TomuRain
相关产品推荐
相关产品推荐

