2013-03-19 2 views
1

У меня есть этот столбец в T-SQL:Найти недостающие числа в столбце

1 
2 
3 
7 
10 

имеют Sql функцию для обнаружения недостающих чисел в последовательности 4,5,6 и 8,9 Я имею попробовать что-то вроде if (ab> 1), то у нас есть недостающее число

с coalesce, но я не понимаю. Благодаря любым ориентации

+0

это поможет, если вы выложили функцию ... –

+0

Если у вас есть такой fucntion, каков ваш вопрос? –

+0

@GordonLinoff «имеет SQL-функцию ...», вероятно, означает «Имеет ли SQL функцию ...?»? хотя, конечно, это всего лишь образованное предположение. – Pondlife

ответ

3

Вы можете попробовать это:

DELCARE @a 
SET @a = SELECT MIN(number) FROM table 
WHILE (SELECT MAX(number) FROM table) > @a 
BEGIN 
IF @a NOT IN (SELECT number FROM table) 
PRINT @a 
SET @[email protected]+1 
END 
+0

# winces # Хотя это, вероятно, работает, SQL лучше всего работает в «наборах»; в основном, без итераторов/петель. Определенные применения петель _may_ приводят к лучшей производительности, но почти всегда будут избиты установленным методом. –

+0

@ Установка Clockwork-Muse OK обычно быстрее, чем курсор. Представьте решение, основанное на наборе, на указанный вопрос. – Paparazzi

1

Следующий запрос будет определить, где каждая последовательность начинается и число, отсутствуют:

select t.col + 1 as MissingStart, (nextval - col - 1) as MissingSequenceLength 
from (select t.col, 
      (select min(t.col) from t t2 where t2.col > t.col) as nextval 
     from t 
    ) t 
where nextval - col > 1 

Это использование коррелированных подзапросов чтобы получить следующее значение в таблице.

1

Я знаю, что это поздний ответ, но вот запрос, который использует рекурсивные выражения таблицы, чтобы получить недостающие значения между минимальным и максимальным значениями в таблице:

WITH CTE AS 
(
    --This is called once to get the minimum and maximum values 
    SELECT nMin = MIN(t.ID), MAX(t.ID) as 'nMax' 
    FROM Test t 
    UNION ALL 
    --This is called multiple times until the condition is met 
    SELECT nMin + 1, nMax 
    FROM CTE 
    WHERE nMin < nMax 
) 

--Retrieves all the missing values in the table. 
SELECT c.nMin 
FROM CTE c 
WHERE NOT EXISTS 
(
    SELECT ID 
    FROM Test 
    WHERE c.nMin = ID 
) 

Это был протестирован со следующим схема:

CREATE TABLE Test 
(
    ID int NOT NULL 
) 

INSERT INTO Test 
    Values(1) 

INSERT INTO Test 
    Values(2) 

INSERT INTO Test 
    Values(3) 

INSERT INTO Test 
    Values(7) 

INSERT INTO Test 
    Values(10) 
Смежные вопросы