2009-07-23 2 views
0

Мне нужно заполнить столбец текущим подсчетом на основе другого содержимого столбца. Таблицы, как это:Инкрементный счетчик столбцов, основанный на другом содержимом столбца

 
    count  seq_num 
    1  123-456-789 
    1  123-456-780 
    1  123-456-990 
    2  123-456-789 
    2  123-456-990 

Таким образом, по мере изменения столбца seq_num, счетчик сбрасывается в «1», и, как повторов столбцов, счетчик увеличивается на 1.

Это использование SQL2000, и поле seq_num является varchar.

Любые идеи?

+0

Это для вставки или после факта? Если после того, как мы узнаем, что было добавлено первым? – Eric

ответ

0

Если вы вставки, вы можете использовать подзапрос:

В противном случае, вы должны иметь дату на там или какой-либо способ сказать ему, как определить, что было первым:

update table 
set count = 
    (select count(*)+1 from table t2 
    where t2.seq_num = table.seq_num 
      and t2.insertdate < table.insertdate) 
+0

Какой seq_num был первым, не имеет значения. Первый пример выглядит нормально. Я дам ему попробовать. Спасибо за ответ ... это оценено. – 2009-07-27 13:43:56

+0

OK..пробовал первый запрос, но мне нужно обновить, а не вставить. В таблице есть поле count, но оно должно быть заполнено на основе событий seq_num. Поэтому я попробовал второй, но у меня нет второй таблицы для ссылки. Кроме того, дата, когда seq_nums происходит, не имеет значения. – 2009-07-27 14:22:29

0

Если вам нужно будет продолжить обновление в будущем, вы можете попробовать это. Это несколько шагов, но это исправить и настроить его для будущего использования. (возможно, мне нужно проверить мой синтаксис - я больше схожу с ORacle, поэтому я, возможно, перепутал некоторые вещи, но логика должна работать.)

Сначала создайте таблицу, содержащую текущий уровень счетчика для каждой последовательности:

Create newTable (counter int, sequence varchar) 

затем заполнить его с данными, как это: вставку в Новая_таблицу (выберите отчетливый 0 в качестве счетчика, последовательность из таблицы) Это позволит поставить каждый порядковый номер в таблице один раз и счетчик для каждого будет устанавливают на 0.

Затем создайте процедурное обновление с двумя заявлениями обновлений и немного дополнительной логика:

Create procedere counterUpdater(@sequence varchar) as 

Declare l_counter as int; 
select l_counter = counter 
from newTable 
where sequence = @sequence 

--assuming you have a primary key in the table. 
Declare @id int; 
Select top 1 @id = id from table 
where sequence = @sequence 
    and counter is null; 

--update the table needing edits. 
update table 
set counter = l_counter + 1 
where id = @id 

--update the new table so you can keep track of which 
--counter you are on 
update newTable 
set counter = l_counter + 1 
where id = @id 

Затем запустить прок, чтобы выполнить этот прок для каждой записи в таблице.

Теперь у вас должна быть «новая таблица», заполненная используемым в настоящее время счетчиком для каждой записи в таблице. Настройте свой процесс вставки так, чтобы в любое время, когда была создана новая запись, если она уже не указана в newTable, вы добавляете ее со счетом 1, и вы помещаете счет 1 в основную таблицу. Если последовательность существует, используйте вышеприведенную логику (увеличьте счетчик уже при использовании «newTable» и поместите его в качестве значения счетчика в newTable и mainTable.

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

Во-первых, чтобы обновить: --find вне значение счетчика Объявите l_counter INT выберите l_counter = макс (счетчик) из таблицы, где сл uence = @sequence

update table 
set counter = l_counter + 1 
where id = (select top 1 id from table where sequence = @sequence 
      and counter is null) 

затем запустите это для каждой записи.

Затем, при вставке новых записей:

Declare l_counter int 
select l_counter = max(counter) 
from table where sequence = @sequence 

IsNull(l_counter, 0) 

Insert into table 
(counter, sequence) values (l_counter + 1, @sequence) 

Опять же, я уверен, я смешанный и соответствие моего синтаксиса здесь, но понятия должны работать. Конечно, это подход «по одному», а не набор, поэтому он может быть немного неэффективным, но он будет работать.