SQL - 在大多数有序序列中查找缺少的int值

caj*_*oki 2 sql oracle gaps-and-islands

我管理一个基于消息的系统,其中一系列独特的整数id将在一天结束时完全表示,尽管它们不一定按顺序到达.

我正在寻找帮助,使用SQL在本系列中找到缺失的ID.如果我的列值如下所示,在这种情况下,如何找到此序列中缺少的ID 6

序列将在每天的任意点开始和结束,因此每次运行时min和max会有所不同.来自Perl背景我通过一些正则表达式.

ids
1
2
3
5
4
7
9
8
10
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助.

编辑:我们运行oracle

编辑2:谢谢大家.我将在下周在办公室中查看您的解决方案.

编辑3:我暂时解决了类似下面的问题,ORIG_ID是原始的id列,MY_TABLE是源表.仔细观察我的数据,除了字符串中的数字数据外,还有很多种情况.在某些情况下,有一个非数字字符的前缀或后缀.在其他情况下,在数字id中混合了破折号或空格.除此之外,ID会定期出现多次,因此我包含了不同的内容.

我将不胜感激任何进一步的输入,特别是关于剥离非数字字符的最佳途径.

SELECT 
   CASE
      WHEN NUMERIC_ID + 1 = NEXT_ID - 1
         THEN TO_CHAR( NUMERIC_ID + 1 )
      ELSE TO_CHAR( NUMERIC_ID + 1 ) || '-' || TO_CHAR( NEXT_ID - 1 )
   END
   MISSING_SEQUENCES
   FROM
   (
      SELECT
         NUMERIC_ID,
         LEAD (NUMERIC_ID, 1, NULL)
            OVER 
            (
               ORDER BY
                 NUMERIC_ID
                 ASC
            )
            AS NEXT_ID
         FROM 
         (
             SELECT
                DISTINCT TO_NUMBER( REGEXP_REPLACE(ORIG_ID,'[^[:digit:]]','') ) 
                AS NUMERIC_ID
             FROM MY_TABLE
         )
    ) WHERE NEXT_ID != NUMERIC_ID + 1
Run Code Online (Sandbox Code Playgroud)

bon*_*svr 5

我去过那儿.

FOR ORACLE:

我刚刚在网上发现这个非常有用的查询并记下来,但是我现在不记得该网站,你可以"GAP ANALYSIS"在Google上搜索.

SELECT   CASE
             WHEN ids + 1 = lead_no - 1 THEN TO_CHAR (ids +1)
          ELSE TO_CHAR (ids + 1) || '-' || TO_CHAR (lead_no - 1)
         END
             Missing_track_no
   FROM   (SELECT   ids,
                    LEAD (ids, 1, NULL)
                     OVER (ORDER BY ids ASC)
                        lead_no
             FROM   YOURTABLE
             )
   WHERE   lead_no != ids + 1
Run Code Online (Sandbox Code Playgroud)

这里的结果是:

MISSING _TRACK_NO
-----------------
       6
Run Code Online (Sandbox Code Playgroud)

如果存在多个缺口,比如说2,6,7,9那么它将是:

MISSING _TRACK_NO
-----------------
        2
       6-7
        9
Run Code Online (Sandbox Code Playgroud)