我管理一个基于消息的系统,其中一系列唯一整数 ID 将在一天结束时完全表示,尽管它们不一定按顺序到达。
我正在寻找使用 SQL 查找本系列中缺少的 id 的帮助。如果我的列值如下所示,在这种情况下,如何找到我在这个序列中缺少的 id 6?
该序列将在每天的任意点开始和结束,因此每次运行时 min 和 max 会有所不同。来自 Perl 背景,我通过那里的一些正则表达式。
ids
1
2
3
5
4
7
9
8
10
帮助将不胜感激。
编辑:我们运行 oracle
编辑2:谢谢大家。下周我将在办公室介绍您的解决方案。
Edit3:我暂时解决了以下问题,ORIG_ID 是原始 id 列,MY_TABLE 是源表。在仔细查看我的数据时,除了字符串中的数字数据之外,还有多种情况。在某些情况下,存在非数字字符的前缀或后缀。在其他情况下,数字 id 中混有破折号或空格。除此之外,id 会定期出现多次,所以我包括了 distinct。
我将不胜感激任何进一步的输入,特别是关于去除非数字字符的最佳途径。
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