2015-03-04 3 views
0

Я ищу недостающее число в списке, он отлично работает, но когда он начинается с 2, можно ли получить 1. ниже вставки он должен предоставить 1 не 4 . пожалуйста, помогите спасибоОтсутствующее число или максимальное число из списка

drop table #temp 
create table #temp 
(
Number INT 
) 

insert into #temp 
(Number) 
select 2 union all 
select 3 union all 
select 5 


SELECT MIN(t1.Number) + 1 AS MissingNumber 
FROM #temp t1 
LEFT OUTER JOIN #temp t2 ON (t1.Number + 1 = t2.Number) 
WHERE t2.Number IS NULL 
+1

что является целью выполнения этой операции? – Tanner

ответ

2

Я предлагаю вам создать отдельный numbers таблицу, чтобы сделать это.

Существует множество способов создания таблицы чисел. Проверьте это link для получения дополнительной информации

SELECT TOP (1000) n = Row_number()OVER (ORDER BY number) 
INTO #numbers 
FROM [master]..spt_values 
ORDER BY n; 

CREATE TABLE #temp 
    (Number INT) 

INSERT INTO #temp(Number) 
SELECT 2 
UNION ALL 
SELECT 3 
UNION ALL 
SELECT 5 

SELECT Min(t1.n) AS MissingNumber 
FROM #numbers t1 
     LEFT OUTER JOIN #temp t2 
        ON (t1.n = t2.Number) 
WHERE t2.Number IS NULL 
0

Я думаю, что его не представляется возможным, потому что объединения не знает, что номер начинается с 1. он будет искать минимальное значение.

мы можем использовать в то время как цикл, чтобы решить проблему

0

использовать этот

IF OBJECT_ID('Tempdb..#temp') IS NOT NULL 
    DROP TABLE #temp 
CREATE TABLE #temp (Number INT) 
INSERT INTO #temp 
     (Number) 
VALUES (2), 
     (3), 
     (5); 
WITH cte 
      AS (SELECT n = 1 
       UNION ALL 
       SELECT n + 1 
       FROM  cte 
       WHERE n <= 100 --can be increased with OPTION (MAXRECURSION {iteration value}) at the end of the query 
      ) 
    SELECT MIN(cte.n) AS MissingNumber 
    FROM cte 
      LEFT JOIN #temp t ON (cte.n = t.Number) 
    WHERE t.Number IS NULL 
Смежные вопросы