SQL-任何数字范围重叠

时间:2013-10-11 01:15:12

标签: sql oracle

我有一个包含数字范围列表的表。我需要知道这些数字范围中是否有任何一个重叠

SQL Fiddle here

例如,小提琴中的最后两行彼此重叠。我不确定你如何在查询结果中显示它。

任何帮助都将不胜感激。

编辑:不确定这是否有效,但似乎是:

SELECT
  *
FROM
(
  SELECT
    FROM_NUM,
    TO_NUM,
    LEAD(FROM_NUM) OVER (ORDER BY FROM_NUM) A
  FROM
    RANGES
) RANGES
WHERE
  A < TO_NUM

1 个答案:

答案 0 :(得分:0)

SELECT RANGES.FROM_NUM AS BASE_FROM_NUM,  RANGES.TO_NUM AS BASE_TO_NUM,
  OVERLAP.FROM_NUM AS OVERLAP_FROM_NUM, OVERLAP.TO_NUM AS OVERLAP_TO_NUM
FROM RANGES
INNER JOIN RANGES OVERLAP 
ON (((OVERLAP.FROM_NUM <= RANGES.FROM_NUM) AND (OVERLAP.TO_NUM >= RANGES.FROM_NUM))
OR ((OVERLAP.FROM_NUM <= RANGES.TO_NUM) AND (OVERLAP.TO_NUM >= RANGES.TO_NUM)))
AND ((OVERLAP.FROM_NUM <> RANGES.FROM_NUM) AND (OVERLAP.TO_NUM <> RANGES.TO_NUM))

最后一行仅用于停止报告自身重叠的行。在实践中,您可以使用唯一键删除它们(以防万一您有重复的行具有相同的from / to数字):

AND (OVERLAP.ID <> RANGES.ID)