我管理一个基于消息的系统,其中一系列唯一整数 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