문제

나는 이와 같은 가치 테이블이 있습니다

978412, 400
978813, 20
978834, 50
981001, 20

보시다시피 첫 번째 숫자는 첫 번째 숫자가 시퀀스에서 다음 숫자보다 1 숫자입니다. 마지막 숫자는 범위에 있지 않습니다 (다음 값에서와 같이 직접 순서를 따르지 않음). 내가 필요한 것은 이것을 출력 할 CTE (예, 이상적으로)입니다.

978412, 472
981001, 20

첫 번째 행에는 범위의 시작 번호와 내면의 노드의 합이 포함됩니다. 다음 행은이 예에서 원래 데이터와 동일한 다음 범위입니다.

도움이 되었습니까?

해결책

Josh가 게시 한 기사에서 여기에 내 테이크 (테스트 및 작업)가 있습니다.

SELECT
    MAX(t1.gapID) as gapID,
    t2.gapID-MAX(t1.gapID)+t2.gapSize as gapSize
    -- max(t1) is the specific lower bound of t2 because of the group by.
FROM
  ( -- t1 is the lower boundary of an island.
    SELECT gapID
    FROM gaps tbl1 
    WHERE
      NOT EXISTS(
        SELECT *
        FROM gaps tbl2 
        WHERE tbl1.gapID = tbl2.gapID + tbl2.gapSize + 1
      )
  ) t1
  INNER JOIN ( -- t2 is the upper boundary of an island.
    SELECT gapID, gapSize
    FROM gaps tbl1 
    WHERE
      NOT EXISTS(
        SELECT * FROM gaps tbl2 
        WHERE tbl2.gapID = tbl1.gapID + tbl1.gapSize + 1
      )
  ) t2 ON t1.gapID <= t2.gapID -- For all t1, we get all bigger t2 and opposite.
GROUP BY t2.gapID, t2.gapSize

다른 팁

이것을 확인하십시오 MSDN 기사. 문제에 대한 솔루션을 제공합니다. 귀하가 작동하는 경우 귀하가 가진 데이터의 탄수 및 쿼리의 성능 요구 사항에 따라 다릅니다.

편집하다:

쿼리의 예제를 잘 사용하고 마지막 솔루션을 사용하여 섬을 얻는 두 번째 방법입니다 (첫 번째 방법으로 SQL 2005의 오류가 발생했습니다).

SELECT MIN(start) AS  startGroup, endGroup, (endgroup-min(start) +1) as NumNodes
FROM (SELECT g1.gapID AS start,
(SELECT min(g2.gapID) FROM #gaps g2 
WHERE g2.gapID >= g1.gapID and NOT EXISTS
(SELECT * FROM #gaps g3 
WHERE g3.gapID - g2.gapID = 1)) as endGroup
FROM #gaps g1) T1 GROUP BY endGroup

내가 추가 한 것은 (endgroup-min(start) +1) as NumNodes. 이것은 당신에게 수를 줄 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top