2012-08-31 50 views
0

我試圖找出數字範圍(SQL Server)中的差距。我的情況是低於...查找跨越多列的數字範圍的差距

ID Start End 
1  1  4 
2  1  6 
3  2  4 
4  8  10 
5  13  14 

Visual 
------------------------------- 
1-2-3-4 
1-2-3-4-5-6 
    2-3-4 
      - -8-9-10 
        - - -13-14 

這樣做的結果可能是沿着線的東西:

Table 
------------------------------- 
ID Start End Gap 
4  8  10 -1 
5  13  14 -2 

最後,我想有間隙的範圍,但我應該能夠人物說出來上面......

Missing 
7 
11-12 

我想出了是不是太緩慢或不佔範圍的重疊(例如ID 2)

解決方案
CREATE TABLE #Docs (
    [Rank] INT, --DENSE_RANK() OVER(ORDER BY BegProd) 
    ControlNumber BIGINT, 
    BegProd INT, 
    EndProd INT 
) 

SELECT 
    T1.ControlNumber, 
    T1.BegProd, 
    T1.EndProd, 
    MAX(T2.EndProd) AS [PreviousEndProd], 
    [Gap] = T1.BegProd - MAX(T2.EndProd) - 1 
FROM #Docs T1 
INNER JOIN #Docs T2 
    ON T1.[Rank] = T2.[Rank] + 1 
    AND T1.EndProd > T2.EndProd 
GROUP BY T1.ControlNumber, T1.BegProd, T1.EndProd 
HAVING T1.BegProd - MAX(T2.EndProd) > 1 

有200多萬行此表和1比1十億

編輯 固定「失蹤」表的範圍跨度。 間隔列表示在起始數字之前有多少間隙。 (如缺少#7是1號)

+0

我不明白正是你所期待的 - 我不能做的意義你的示例表輸出(在Gap列中值-1的意義是什麼?)也就是說,你可以使用一個Tally表。看看這篇關於計數表的文章:http://www.sqlservercentral.com/articles/T-SQL/62867/ – jlnorsworthy

+0

你*失蹤*,例如9和11-12;你的意思是7而不是9? –

+0

修正_Missing_表並澄清_Gap_列...查看Tally表。感謝你目前的幫助! – user1002479

回答

1

試試這個:

create table #docs(id int, start int, [end] int) 
insert #docs values(1,1,4),(2,1,6),(3,2,4),(4,8,10),(5,13,14) 

;with a as 
(
select start, dense_rank() over (order by start) rn 
from #docs t where not exists (select 1 from #docs where t.start > start and t.start < [end]) 
group by start 
), b as 
(
select [end], dense_rank() over (order by [end]) rn 
from #docs t where not exists (select 1 from #docs where t.[end] > start and t.[end] < [end]) 
group by [end] 
) 
select 
case when a.[start]= b.[end]+2 then cast(a.start-1 as varchar(21)) 
else cast(b.[end]+1 as varchar(10)) +'-' + cast(a.start - 1 as varchar(10)) end missing 
from a join b on a.rn - 1 = b.rn 
and a.[start] <> b.[end] + 1 

結果:

Missing 
7 
11-12 
+0

使用此結束。謝謝 – user1002479