2013-08-20 3 views
0

T-SQL 쿼리를 작성하여 zip4 범위의 틈이있는 모든 우편 번호를 찾으려고합니다.zip4 코드에서 공백을 찾기위한 쿼리

우편 범위 :

Zip minRangeZip4 maxRangeZip4 

85005 0     6505 
85005 6506    9999 
85006  0     5555 
85006  5559    9999 

가 어떻게 85006에 대한 zip4 범위 사이에 차이가 있음을 데리러 쿼리를 작성합니다 여기에 내 데이터의 샘플 테이블은?

+0

동일한 Zip 값을 가진 행 수에 제한이 있습니까? –

+0

아니요 저는 40 개의 다른 우편 번호가있는 우편 번호가 있습니다. 각 우편 번호마다 다른 세율이 있습니다. – user2683873

답변

1

SQL Server 2012를 사용하는 경우 아래와 같이 Lead (또는 Lag)을 사용할 수 있습니다.

;with cte as (
    select Zip, minRangeZip4, maxRangeZip4, 
     lead(minRangeZip4) over (partition by zip order by minRangeZip4) leadVal 
from t 
) 
select Zip 
from cte 
where maxRangeZip4 +1 <> leadVal  
order by Zip 

Fiddle Demo

결과

| ZIP | 
--------- 
| 85006 | 
0

각 우편 번호에 대한 이러한 차이점을 요약하면 다음 최대 및 최소 범위의 각 행과의 차이를 가지고가는 경우에, 당신은 식별 할 수있을 것입니다 우편 번호에 전체 범위가 없습니다. 그 차이의 합은 틈이없는 zip의 경우 10,000이며 틈이있는 zip의 경우 10,000 이하가됩니다.

SELECT zip, SUM(maxRangeZip4-minRangeZip4+1) 
FROM zips 
GROUP BY zip 
HAVING SUM(maxRangeZip4-minRangeZip4+1) <> 10000 

다음은 데이터 설정이 SQL Fiddle 인 예입니다. 나는 이것을 SQL Server 2008에서 테스트했으며 다른 데이터베이스 버전에서도 작동 할 것입니다.

참고 : maxRangeZip4와 minRangeZip4의 차이를 고려할 때 코드 개수가 최소값을 포함해야하므로 1을 더해야합니다. 당신에게 우편은 항상 0으로 시작하면 우편 번호가 항상 0

SELECT zip, SUM(maxzip)-SUM(minzip)+MIN(minzip)+COUNT(*)-1-MAX(maxzip) AS missing 
FROM ranges 
GROUP BY zip 
HAVING missing <> 0 

이 시작되지 않습니다 가정 간격을 참아 줄 것이 쿼리를 간단한 수학을 사용

0

, 단지 min(minzip)

을 제거 두 쿼리 모두에 표시됩니다. DEMO

관련 문제