Я управляю системой, основанной на сообщениях, в которой последовательность уникальных целочисленных идентификаторов будет полностью представлена в конце дня, хотя они не обязательно будут поступать по порядку.
Я ищу помощь в поиске пропущенных идентификаторов в этой серии с использованием SQL. Если значения моего столбца похожи на приведенные ниже, как я могу найти, какие идентификаторы отсутствуют в этой последовательности, в данном случае 6
?
Последовательность будет начинаться и заканчиваться в произвольной точке каждый день, поэтому min и max будут различаться при каждом запуске. Исходя из фона Perl я через некоторое регулярное выражение там.
ids
1
2
3
5
4
7
9
8
10
Помощь будет высоко ценится.
Редактировать: Мы запускаем оракула
Edit2: Спасибо всем. Я рассмотрю ваши решения на следующей неделе в офисе.
Edit3: я остановился на чем-то похожем на приведенное ниже: ORIG_ID - исходный столбец id, а MY_TABLE - исходная таблица. Если присмотреться к моим данным, есть множество случаев, помимо числовых данных в строке. В некоторых случаях есть префикс или суффикс нечисловых символов. В других есть тире или пробелы, смешанные в числовой идентификатор. Помимо этого, идентификаторы периодически появляются несколько раз, поэтому я включил различные.
Буду признателен за любые дальнейшие замечания, особенно в отношении наилучшего способа удаления нецифровых символов.
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