Запрос для получения списка отсутствующих последовательных номеров

#sql-server

#sql-сервер

Вопрос:

У меня есть настроенный запрос, который просматривает таблицу заказов и получает список отсутствующих последовательных номеров заказов, поэтому мы можем использовать этот список для отслеживания отсутствующих заказов.
Кажется, он работает нормально, за исключением того, что я получаю только первое число, если их несколько подряд.
Итак, если результат должен быть: 1,5,6,10, я вместо этого получаю: 1,5,10 6 не учитывается

Я не мастер SQL, и я не совсем понимаю, что нужно изменить в коде, чтобы убедиться, что я получу их все. Вот код, который у меня есть:

 DECLARE @maxorder INT
SET @maxorder = (SELECT MAX(CAST(TranNo) AS INT)
FROM SalesOrder 
WHERE TranDate 
BETWEEN getdate()-1 AND DATEADD(DAY, 1, GETDATE()))
SELECT a.offset AS Missing
FROM 
(SELECT 1 AS Offset
UNION
SELECT CAST((TranNo) AS INT)   1
FROM SalesOrder
WHERE TranDate BETWEEN GETDATE()-1 AND DATEADD(DAY, 1, GETDATE())) a
LEFT JOIN
(SELECT CAST((TranNo) AS INT) AS TranNum 
FROM SalesOrder 
WHERE TranDate BETWEEN getdate()-1 AND DATEADD(DAY, 1, GETDATE())) b 
ON a.offset = b.trannum
WHERE 
a.offset > 1 
AND b.trannum IS NULL
AND a.offset < @maxorder
ORDER BY Missing
 

Заранее спасибо!

Комментарии:

1. Какая версия SQL? В более поздних версиях есть несколько очень простых способов решить эту проблему.

2. Также были бы полезны некоторые примеры данных, а также то, что вы ожидаете увидеть на основе этих данных.

3. Получить минимальное и максимальное число. Заполните временную таблицу всем диапазоном. Затем влево / вправо соедините два с условием null для ваших данных. Вы увидите все отсутствующие записи

4. Примерные данные: ожидается 86092, 86094, 86101: 86092, 86094, 86095, 86096, 86101

5. ТС, я не уверен на 100%, как это сделать. Я не совсем профессионал в SQL. Я посмотрю, смогу ли я это выяснить. Спасибо, ребята.

Ответ №1:

 DECLARE @maxorder INT, @counter INT = 1 --Set this to your lower bound for SalesOrder table

SELECT @maxorder = MAX(CAST(TranNo AS INT))
FROM SalesOrder

CREATE TABLE #temp (TranNum INT)

WHILE @counter <= @maxorder
BEGIN
    INSERT INTO #temp (TranNum) values (@counter)
END

SELECT t.TranNum
FROM #temp t
LEFT OUTER JOIN SalesOrder s ON t.TranNum = CAST(s.TranNo AS INT)
WHERE s.TranNo is null
ORDER BY t.TranNum
 

Комментарии:

1. Спасибо. Это заставило меня приступить к устранению проблемы. Я ценю это! Я использовал табличную переменную вместо временной таблицы, добавил и переместил несколько вещей, и это работает как шарм. Потрясающе!