查询以查找zip4代码中的空白

时间:2013-08-20 16:01:26

标签: sql tsql sql-server-2012

我正在尝试撰写T-SQL查询,以查找在zip4范围内存在差距的所有邮政编码。以下是我的数据示例表:

Zip范围:

Zip    minRangeZip4    maxRangeZip4

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

如何编写查询以确定zip4的{​​{1}}范围之间存在差距?

3 个答案:

答案 0 :(得分: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 |

答案 1 :(得分:0)

如果您获取每行的最大和最小范围之间的差异,然后对每个zip的差异求和,您将能够识别哪些邮政编码不具有​​完整范围。对于没有间隙的拉链,差异的总和为10,000,对于有间隙的拉链,差异的总和将小于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,因为代码的数量必须包含最小值。

答案 2 :(得分:0)

使用简单的数学运算,这个查询会给你拉链,假设拉链并不总是以0开头

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

如果zip始终以0开头,请删除min(minzip)

这两个查询都显示在DEMO