如何在SQLServer中检查序列

如何在SQLServer中检查序列,sql,sql-server,Sql,Sql Server,我有一些场景,我需要检查序列,我需要以下值的序列 这是sql db中显示的实际数据 10001 10001 10002 10002 10003 10003 10005 10005 10006 10006 10008 10008 10009 10009 10010 10010 所以我需要一个像这样的值的范围 10001 10003 10005 10006 10008 10010 如果我在sql中添加新行 10004 10004 插入上述行后,实际数据以sql db形

我有一些场景,我需要检查序列,我需要以下值的序列

这是sql db中显示的实际数据

10001 10001 10002 10002 10003 10003 10005 10005 10006 10006 10008 10008 10009 10009 10010 10010 所以我需要一个像这样的值的范围

10001 10003 10005 10006 10008 10010 如果我在sql中添加新行

10004 10004 插入上述行后,实际数据以sql db形式显示

10001 10001 10002 10002 10003 10003 10004 10004 10005 10005 10006 10006 10008 10008 10009 10009 10010 10010 那么射程是

10001 10006 10008 10010 如果我在sql中添加新行

10007 10007 插入上述行后,实际数据以sql db形式显示

10001 10001 10002 10002 10003 10003 10004 10004 10005 10005 10006 10006 10008 10008 10007 10007 10009 10009 10010 10010 那么射程是

10001 10010
有人能帮我解决这个问题吗?这是一个典型的缺口和孤岛问题。我能够立即识别出您的查询需要什么,但是由于这些问题在堆栈溢出上似乎很少出现,所以我需要一个引用来震动我的内存。在微软的TechNet网站上有一个关于差距、孤岛和性能的深入讨论。我建议您阅读它,以便了解下面的查询是如何工作的

SELECT t1.gapID as startOfGroup, MIN(t2.gapID) AS endOfGroup
FROM
(
    SELECT gapID
    FROM gaps tbl1 
    WHERE NOT EXISTS
    (
        SELECT * FROM gaps tbl2 
        WHERE tbl1.gapID = tbl2.gapID + 1
    )
) t1
INNER JOIN
(
    SELECT gapID
    FROM gaps tbl1 
    WHERE NOT EXISTS
    (
        SELECT * FROM gaps tbl2 
        WHERE tbl2.gapID = tbl1.gapID + 1
    )
) t2
    ON t1.gapID <= t2.gapID
GROUP BY t1.gapID
我在MySQL中为您的问题创建了一个提琴,因为该站点上的SQL Server似乎一直处于崩溃状态


对于任何较新版本的SQL Server,都可以使用窗口函数轻松解决此问题:

declare @t table(i int)
insert @t values (10001), (10002), (10003), (10005), (10006), (10008), (10009), (10010)

;with x as (
  select *, case when i = lag(i) over(order by i)+1 then 0 else 1 end g from @t
),
y as (
  select i, sum(g) over(order by i) sg from x
)
select min(i), max(i) from y group by sg