我有一个包含从 0 到某个大数 N 的整数值的表,但有一些数字间隙。我正在尝试编写一个高效的查询,它会找到第一组连续值,这些值的长度在 0 和 N 之间,但不包含在所述表中.这具有查找未使用的 ID 等的应用程序。
例如,给定集合
[1,2,3,4,10,11,12,13,14,15]
,找到不在集合中的连续 5 个数字的范围。应该是
[5,6,7,8,9]
.我如何在一个单一的、高效的查询中写这个?谢谢。
最佳答案
这是SQL Server MVP Deep Dives书中关于这个主题的精彩章节。
http://www.manning.com/nielsen/SampleChapter5.pdf
解决方法之一
WITH StartingPoints AS
(
SELECT seqval, ROW_NUMBER() OVER(ORDER BY seqval) AS rownum
FROM dbo.NumSeq AS A
WHERE NOT EXISTS
(SELECT *
FROM dbo.NumSeq AS B
WHERE B.seqval = A.seqval - 1)
),
EndingPoints AS
(
SELECT seqval, ROW_NUMBER() OVER(ORDER BY seqval) AS rownum
FROM dbo.NumSeq AS A
WHERE NOT EXISTS
(SELECT *
FROM dbo.NumSeq AS B
WHERE B.seqval = A.seqval + 1)
)
SELECT S.seqval AS start_range, E.seqval AS end_range
FROM StartingPoints AS S
JOIN EndingPoints AS E
ON E.rownum = S.rownum;
关于MySQL - 查询以查找连续范围的未使用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3328557/