0

我正在尝试编写一个查询来查找所有在其范围内T-SQL有间隙的邮政编码。zip4这是我的数据的示例表:

邮编范围:

Zip    minRangeZip4    maxRangeZip4

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

zip4我将如何编写查询以发现范围之间存在差距85006

4

3 回答 3

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

小提琴演示

结果

|   ZIP |
---------
| 85006 |
于 2013-08-20T16:18:14.407 回答
0

如果您获取每行的最大和最小范围之间的差异,然后将每个邮政编码的差异相加,您将能够确定哪些邮政编码没有完整的范围。对于没有间隙的拉链,差异之和将为 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,因为码数需要包含最小值。

于 2013-08-20T16:26:46.700 回答
0

使用简单的数学,此查询将为您提供有间隙的 zip,假设 zip 并不总是以 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)

两个查询都显示在演示中

于 2013-08-20T16:31:05.280 回答