我有一个包含数字范围列表的表。我需要知道这些数字范围中是否有任何一个重叠
例如,小提琴中的最后两行彼此重叠。我不确定你如何在查询结果中显示它。
任何帮助都将不胜感激。
编辑:不确定这是否有效,但似乎是:
SELECT
*
FROM
(
SELECT
FROM_NUM,
TO_NUM,
LEAD(FROM_NUM) OVER (ORDER BY FROM_NUM) A
FROM
RANGES
) RANGES
WHERE
A < TO_NUM
答案 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)