3

数値範囲のリストを含むテーブルがあります。これらの数値範囲のいずれかが互いに重複しているかどうかを知る必要があります

SQLフィドルはこちら

たとえば、フィドルの最後の 2 行が互いに重なり合っています。クエリ結果でそれをどのように表示するかさえわかりません。

どんな助けでも大歓迎です。

編集:これが機能するかどうかはわかりませんが、次のように見えます:

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

1 に答える 1

1
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)
于 2013-10-11T02:08:37.997 に答える