SQL Server를 사용하여 원거리 값을 그룹화하는 방법
-
19-08-2019 - |
문제
나는 이와 같은 가치 테이블이 있습니다
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
. 이것은 당신에게 수를 줄 것입니다.
제휴하지 않습니다 StackOverflow