2015-07-27 4 views
0

В SQL Server 2008 r2 У меня есть столбец «Activity_ID», который является целым числом и может иметь диапазон значений (т. Е. 20, 21, 22, 28, 29, 37, 38, 41).SQL - Как выбрать следующее значение в столбце?

У меня нет способа узнать, каким будет Activity_ID.

Есть ли способ проверить следующий высокий Activity_ID (а затем сделать X, как только я его нашел)?

M

+1

Набор данных и желаемый результат будут полезны для вашего вопроса. Правильно, ваш вопрос неясен. –

+3

Если вы задаете «следующее» значение вручную, у вас будут проблемы с параллелизмом. Является ли этот столбец личным? В любом случае, вам нужно осознавать потенциальные проблемы параллелизма и соответственно писать свой код. –

+1

Почему вместо этого не используется столбец идентификации? [ИДЕНТИФИКАЦИЯ СОБСТВЕННОСТИ] (https://technet.microsoft.com/en-us/library/aa933196 (v = sql.80) .aspx) –

ответ

0
declare @tb table 
    (
    orderNumber int identity(1,1), 
    value int 
) 

    insert into @tb values(20) 
    insert into @tb values(21) 
    insert into @tb values(22) 
    insert into @tb values(28) 
    insert into @tb values(29) 
    insert into @tb values(37) 
    insert into @tb values(38) 
    insert into @tb values(41) 



    declare @v table(
    activity_id int 
) 

    insert into @v values(37) 

    select 
     (select top 1 value from @tb t1 where t1.value > v.activity_id) 
    from @v v 
+0

Почему не использовать только функцию MAX()? –

+0

Что происходит, когда два человека делают одно и то же в одно и то же время? Они оба получат одинаковое значение, и все будет разваливаться. –

1

В SQL Server 2012 или более поздней версии, вы должны использовать lag или lead. В 2008 году вы можете моделировать то же поведение с номером строки. Я предполагаю, что здесь, потому что ваш вопрос не пришел с образцами данных, но это может выглядеть примерно так:

;with CTE as 
    (select * 
    , Row_Number() over (partition by Name order by ActivityCode) as RN 
    from MyTable) 

select a.*, b.activitycode as NextHighestCode 
from CTE a 
left join CTE b 
on a.name = b.name 
and a.RN = b.RN - 1 

Это будет возвращать значения в таблице (заменить name с любыми реальными столбцами у вас есть), и следующий наивысший код активности для каждой строки. Это может не обрабатывать связи так, как вы ожидали бы, поэтому вы можете добавить дополнительные столбцы в предложение partition, если вы их ожидаете.

Смежные вопросы