Как получить максимальное последовательное значение?

Наличие таблицы со столбцом, который представляет собой перечисление:

ДЕЛО 1

| CustomID | Values | | '001'| ...| | '002'| ...| | '005'| ...| | '006'| ...| 

Мне нужно получить максимальное значение в последовательном порядке, в этом случае: '002'

 | CustomID | Values | | '028'| ...| | '029'| ...| | '031'| ...| | '032'| ...| 

Ожидаемый результат: '029' .

CASE 2 Но если данные выглядят так:

 | CustomID | Values | | '001'| ...| | '002'| ...| | '003'| ...| | '004'| ...| 

Мне нужно получить '004' .

Вам нужен первый раз, когда разрыв не один. Предполагая, что значения являются фактически числами, самый простой способ – использовать lead() :

 select min(t.customId) from (select t.*, lead(customId) over (order by CustomId) as next_customId from t ) t where next_CustomId is null or next_CustomId <> CustomId + 1; 

РЕДАКТИРОВАТЬ:

В SQL Server 2008 вы можете сделать то же самое с outer apply :

 select min(t.customId) from (select t.*, next.customId as next_customId from t outer apply (select top 1 t2.* from t t2 where t2.CustomId > t.CustomId order by t2.CustomId ) next ) t where next_CustomId is null or next_CustomId <> CustomId + 1; 

Что-то вроде этого должно работать:

 ;WITH cte As ( SELECT CAST(CustomID As INT) As cid FROM yourTable ) SELECT MIN(cid) As MaxSeq FROM cte As c1 WHERE NOT EXISTS(Select * From cte As c2 Where c2.cid = c1.cid+1) ; 

Нет необходимости в оконной функции / cte / подзапросах. Вы можете использовать простой LEFT JOIN :

 SELECT MIN(t.CustomID) FROM #tab t LEFT JOIN #tab t1 ON t.CustomID = t1.CustomID - 1 WHERE t1.CustomID IS NULL; 

LiveDemo

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

Давайте будем гением компьютера.