GAPSAND ISLANDS

寻找列中的gap.其实在inside sql server 2008中有专门的讨论。

create table test (id int primary key); go

insert into values (1),(2),(3),(4),(5),(6),(8),(9),(11),(12),(13),(14),(18),(19)

查找出结果为:

missingbefore missingafter

6                           8

9                           11

14                         18

以下为sql:

第一种方法使用了一个辅助表temp(tid int primarykey).在里面插入了一定量的数据。

WITH CTE AS
(
 SELECT
 TID 
 FROM
 temp WHERE TID<=
 (SELECT MAX(ID)FROM TEST)
)
,
CTE2 AS
(
SELECT * 
FROM CTE
WHERE TID NOT IN 
(
 SELECT ID FROM TEST 
)
),
CTE3 AS
(
SELECT 
ROW_NUMBER() OVER(ORDER BY T2.ID) AS ROWNO
,T2.ID
FROM CTE2 T1
JOIN TEST T2
ON
( T1.TID=T2.ID-1
OR T1.TID=T2.ID+1)
)
SELECT 
T.ID AS MISSINGAFTER,
T1.ID AS MISSINGBEFORE
FROM CTE3 T
JOIN CTE3 T1
ON T.ROWNO=T1.ROWNO-1
WHERE T.ROWNO%2=1
and T1.ROWNO%2=0
 WITH TT AS 
 (
 select  ROW_NUMBER() over(  order by cur.id asc) as rownumber,
    bef.id as bef_id,  
    cur.id as cur_id,  
    aft.id as aft_id        
  from test cur  
  left join test bef  
  on cur.id=bef.id+1  
  left join test aft  
  on cur.id=aft.id-1 
 )
 SELECT bf.cur_id as missing_after,  
        af.cur_id as missing_before   
 FROM TT as bf
 join TT as af on bf.rownumber=af.rownumber-1
 where af.cur_id-bf.cur_id>1; 
原文地址:https://www.cnblogs.com/huaxiaoyao/p/2295921.html