数値の範囲のギャップを特定しようとしています (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 つの番号です)