【问题标题】:how to check sequence in sql server如何在sql server中检查序列
【发布时间】:2016-11-18 04:35:59
【问题描述】:

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

这是在 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

谁能帮忙解决这个问题

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是一个典型的间隙和孤岛问题。我能够立即识别出您的查询需要什么,但由于这些问题在 Stack Overflow 上似乎很少出现,我需要一个参考来唤醒我的记忆。 Microsoft 的 TechNet 站点上有一个great article,它深入探讨了差距、孤岛和性能。我建议您阅读它,以便了解下面的查询是如何工作的。

    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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-18
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多