【发布时间】:2017-05-06 01:36:57
【问题描述】:
我有一个包含一堆数字范围的表格,例如:
ID 开始结束
1 1200 1500
2 1450 1700
3 1800 2100
4 2500 3000
5 2900 3300
我想要做的是仅从该集合中选择不重叠的范围(例如 1,3 和 4,或 1,3 和 5)。此外,我必须能够指定一个额外的“填充”值(如中断),该值可以是可变的。因此,例如,在选择 ID=1 后,我可能希望将 400 添加到最终值(从 1500 到 1900),因此如果 ID=1 是所选范围集的一部分,则 ID=3 也不可用。
我查看了不少于 7-9 篇 SO 帖子,它们看起来都非常接近我的需要,但并非完全如此。我找到了一个可以找到重叠的:
SELECT *
FROM TEMP_Times a
JOIN TEMP_Times b on a.TimeStart <= b.TimeEnd
and a.TimeEnd >= b.TimeStart
and a.TimeID <> b.TimeID;
但是我没能把它转换成我需要的东西。如果需要递归,那很好;一次最多只能抓取 10-12 条记录。
【问题讨论】:
-
我不清楚这种查询的预期结果是什么。正如您所指出的, (1,3,4) 和 (1,3,5) 都满足您提出的条件。 (2,3,4), (2,3,5), (1,3), (1,4), (1,5), (2,3), (2,4), (2 ,5)、(3,4) 和 (3,5)。任何单行也可以。是什么让这些解决方案中的任何一个比其他解决方案更好?
-
需要预期的结果来获取我可以预订设备的时间列表(这些值是整数,但仅用于更快的处理 - 它们代表日期和时间)。有时需要休息来修理或翻新给定的物品。但我得到的是一个长长的从-直到值在很大程度上重叠的列表;有时几分钟,有时几个小时),所以我需要过滤掉一个完全“干净”的列表。
标签: sql-server tsql numbers range