如果你有秩()函数,而不是滞后()函数(换句话说,SQL Server)的,你可以使用这个(由http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-programming/10594/Return-gaps-in-a-sequence建议):
create table test_gaps_in_sequence (x int)
insert into test_gaps_in_sequence values (1)
insert into test_gaps_in_sequence values (2)
insert into test_gaps_in_sequence values (4)
insert into test_gaps_in_sequence values (5)
insert into test_gaps_in_sequence values (8)
insert into test_gaps_in_sequence values (9)
insert into test_gaps_in_sequence values (12)
insert into test_gaps_in_sequence values (13)
insert into test_gaps_in_sequence values (14)
insert into test_gaps_in_sequence values (29)
...
select lower_bound
, upper_bound
from (select upper_bound
, rank() over (order by upper_bound) - 1 as upper_rank
from (SELECT x+n as upper_bound
from test_gaps_in_sequence
, (SELECT 0 n
UNION
SELECT -1
) T
GROUP BY x+n
HAVING MAX(n) = -1
) upper_1
) upper_2
, (select lower_bound
, rank() over (order by lower_bound) as lower_rank
from (SELECT x+n as lower_bound
from test_gaps_in_sequence
, (SELECT 0 n
UNION
SELECT 1
) T
GROUP BY x+n
HAVING MIN(n) = 1
) lower_1
) lower_2
where upper_2.upper_rank = lower_2.lower_rank
order by lower_bound
...或者,包括“外部界限”:
select lower_bound
, upper_bound
from (select upper_bound
, rank() over (order by upper_bound) - 1 as upper_rank
from (SELECT x+n as upper_bound
from test_gaps_in_sequence
, (SELECT 0 n
UNION
SELECT -1
) T
GROUP BY x+n
HAVING MAX(n) = -1
) upper_1
) upper_2
full join (select lower_bound
, rank() over (order by lower_bound) as lower_rank
from (SELECT x+n as lower_bound
from test_gaps_in_sequence
, (SELECT 0 n
UNION
SELECT 1
) T
GROUP BY x+n
HAVING MIN(n) = 1
) lower_1
) lower_2
on upper_2.upper_rank = lower_2.lower_rank
order by coalesce (lower_bound, upper_bound)
这是很难选择的数据,实际上是不存在的。 – 2009-04-29 15:20:01
从评论中可以清楚地看到,你在这里对SQL Server运行。你真的应该在你的问题中说过,或者用标签来表示它([SQL]是SQL问题的通用标记,而不是SQL Server)。 – 2011-02-23 23:03:28