我正在尝试撰写T-SQL
查询,以查找在zip4
范围内存在差距的所有邮政编码。以下是我的数据示例表:
Zip范围:
Zip minRangeZip4 maxRangeZip4
85005 0 6505
85005 6506 9999
85006 0 5555
85006 5559 9999
如何编写查询以确定zip4
的{{1}}范围之间存在差距?
答案 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
结果
| 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
中