Как получить «Следующий доступный номер» с SQL Server?(Не столбец идентичности) - PullRequest
3 голосов
/ 20 июля 2011

Технологии: SQL Server 2008

Итак, я попробовал несколько вариантов, которые я нашел в SO, но ничего не дало мне однозначного ответа.

У меня есть таблицас двумя столбцами (идентификатор транзакции, идентификатор группы), где ни один из них не имеет уникальных значений.Например:

TransID | GroupID
-----------------
23      | 4001
99      | 4001
63      | 4001
123     | 4001   
77      | 2113
2645    | 2113
123     | 2113
99      | 2113   

Изначально groupID был просто произвольно выбран пользователем, но теперь мы его автоматизируем.Дело в том, что мы сохраняем существующую БД без каких-либо изменений существующих данных (слишком много работы, слишком мало выгоды)

Есть ли способ запросить «GroupID» в таблице «GroupTransactions» для следующегодоступное значение GroupID> 2000?

Ответы [ 4 ]

8 голосов
/ 20 июля 2011

Я думаю из вопроса, что вы после следующего доступного, хотя это может не совпадать с макс + 1, верно?- В этом случае:

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

;WITH CTE_Numbers AS (
    SELECT n = 2001
    UNION ALL
    SELECT n + 1 FROM CTE_Numbers WHERE n < 4000 
)
SELECT top 1 n 
FROM CTE_Numbers num
WHERE NOT EXISTS (SELECT 1 FROM MyTable tab WHERE num.n = tab.groupid)
ORDER BY n

Примечание: вам нужно настроить2001/4000 значения в CTE, чтобы учесть желаемый диапазон.Я предположил, что имя вашей таблицы до MyTable

2 голосов
/ 20 июля 2011
select max(groupid) + 1 from GroupTransactions
1 голос
/ 05 марта 2012

Следующие найдут следующий пробел выше 2000:

SELECT MIN(t.GroupID)+1 AS NextID
FROM GroupTransactions t (updlock)
WHERE NOT EXISTS
(SELECT NULL FROM GroupTransactions n WHERE n.GroupID=t.GroupID+1 AND n.GroupID>2000)
AND t.GroupID>2000
0 голосов
/ 31 августа 2018

Всегда есть много способов сделать все. Я решил эту проблему, сделав так:

declare @i int = null 

declare @t table (i int)
insert into @t values (1)
insert into @t values (2)
--insert into @t values (3)
--insert into @t values (4)
insert into @t values (5)
--insert into @t values (6)

--get the first missing number
select   @i = min(RowNumber)
from (
select  ROW_NUMBER() OVER(ORDER BY i) AS RowNumber, i
    from (
        --select distinct in case a number is in there multiple times
        select distinct i
        from @t
        --start after 0 in case there are negative or 0 number
        where i > 0
    ) as a
) as b 
where RowNumber <> i

--if there are no missing numbers or no records, get the max record
if @i is null
    begin
    select @i = isnull(max(i),0) + 1 from @t
    end

select @i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...