如何在SQL Server中检查序列

3
我有一些情况需要检查相应的检查序列,我需要以下值的序列。
这是在SQL数据库中呈现的实际数据:
  • 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数据库中呈现的实际数据如下:
  • 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数据库中呈现的实际数据如下:
  • 10001 10001
  • 10002 10002
  • 10003 10003
  • 10004 10004
  • 10005 10005
  • 10006 10006
  • 10008 10008
  • 10007 10007
  • 10009 10009
  • 10010 10010
那么范围将是:
  • 10001 10010
请帮忙解决此问题,谢谢。
2个回答

1

这是一个经典的间隔和岛屿问题。我能够立即认识到您的查询需要什么,但由于这类问题似乎在Stack Overflow上出现得相当少,我需要参考以激发我的记忆。Microsoft的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 的问题上创建了一个 Fiddle,因为该站点上的 SQL Server 似乎一直存在问题。

SQLFiddle


1

对于任何更新版本的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接