【问题标题】:How to find the gap sequence in non identity column in SQL Server如何在 SQL Server 的非标识列中查找间隙序列
【发布时间】:2019-02-06 02:40:43
【问题描述】:

我在下面的表格中有超过一万行,我想找出该列表中序列号中缺少的空白

CI-480-1617
CI-481-1617
CI-482-1617
CI-483-1617
CI-484-1617
CI-485-1617
CI-486-1617
CI-487-1617
CW-095-1617

你能帮帮我吗?

谢谢

【问题讨论】:

  • 理想情况下,您应该将序列号作为完全独立的数字列。如果您需要经常这样做,那么这是一个值得做出的改变。
  • 你的桌子怎么样?您的数据是什么样的?
  • 这里的差距是什么 - 是中间数字的差距,由第一个和最后一个组件划分吗?请举例说明间隙是什么样的。

标签: sql asp.net sql-server sql-server-2008


【解决方案1】:

没有样本数据,我无法测试解决方案,但在当前情况下,这样的事情可能会对您有所帮助:

WITH CTE AS -- end previous statement with semi colon
(
    SELECT SUBSTRING (ColumnA, 4,3) AS SeqNumb, 
         ROW_NUMBER() OVER (PARTITION BY SUBSTRING (ColumnA, 4,3) ORDER BY (SELECT 1)) AS RowNumb
FROM TableA
)

SELECT C.*, C2.RowNumb - C.RowNumb AS Gap
FROM CTE AS C
LEFT JOIN CTE AS C2 ON C.RowNumb = C2.RowNumb - 1

【讨论】:

    【解决方案2】:

    此解决方案基于一些假设,可能会对您有所帮助:

    • 每行的第一部分是 SECTION
    • 每行的第二部分是 ID

    表创建:

    CREATE TABLE [dbo].[Gaps] (
        [Text] nvarchar(50) NOT NULL
    );
    
    INSERT [dbo].[Gaps] ([Text])
    VALUES 
        ('CI-480-1617'),
        ('CI-481-1617'),
        ('CI-482-1617'),
        ('CI-483-1617'),
        ('CI-484-1617'),
        ('CI-485-1617'),
        ('CI-486-1617'),
        ('CI-487-1617'),
        ('CW-095-1617');
    

    寻找差距:

    WITH IDS (Section, Nmr) AS (
        SELECT 
            SUBSTRING([Text], 1, CHARINDEX('-', [Text]) - 1),
            CONVERT(int, SUBSTRING([Text], CHARINDEX('-', [Text]) + 1, CHARINDEX('-', [Text], CHARINDEX('|', [Text]))))
        FROM Gaps
        UNION ALL
        SELECT 
            DISTINCT SUBSTRING([Text], 1, CHARINDEX('-', [Text]) - 1),
            0
        FROM Gaps
        -- Uncomment next lines if you want to get the gap to some MAX value
        --UNION ALL
        --SELECT 
        --  DISTINCT SUBSTRING([Text], 1, CHARINDEX('-', [Text]) - 1),
        --  1000
        --FROM Gaps
    )
    SELECT Section, StartNmr = cur + 1, EndNmr = nxt - 1
    FROM (
        SELECT 
            Section, 
            cur = Nmr, 
            nxt = (
                SELECT MIN(B.Nmr)
                FROM IDS AS B
                WHERE B.Section = A.Section AND B.Nmr > A.Nmr
            )
        FROM IDS AS A
    ) AS D
    WHERE nxt - cur > 1
    ORDER BY Section, StartNmr
    

    输出(无 MAX 值):

    -----------------------
    Section  StartNmr  EndNmr
    -----------------------
    CI       1         479
    CW       1         94
    

    输出(带 MAX 值):

    -----------------------
    Section  StartNmr  EndNmr
    -----------------------
    CI       1         479
    CI       488       999
    CW       1         94
    CW       96        999
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2021-08-03
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多