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 万行を超える行があり、範囲は 10 億から 10 億です

EDIT '行方不明' テーブルを修正しました。ギャップ列は、その開始番号の前にどれだけのギャップがあるかを示します。(ex 行方不明の #7 は 1 つの番号です)

4

1 に答える 1

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
于 2012-08-31T08:19:30.413 に答える