增量计数列基于另一列内容

时间:2009-07-23 15:12:55

标签: sql sql-server sql-server-2000

我需要根据其他列内容填充一个包含运行计数的列。表格如下:

    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。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果要插入,可以使用子查询:

insert into 
    table (count, seq_num) 
values 
    ((select count(*)+1 from table where seq_num = @seq)
    ,@seq)

否则,你需要在那里有一个日期或某种方式告诉它如何确定第一个:

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

答案 1 :(得分:0)

如果您将来需要继续更新,可以试试这个。这是几个步骤,但会修复它并设置它以备将来使用。 (可能需要检查我的语法 - 我现在更多地讨论ORacle,所以我可能混淆了一些东西 - 但逻辑应该有效。)

首先,创建一个表来包含每个序列的当前计数器级别:

Create newTable (counter int, sequence varchar)

然后,用这样的数据填充它:    插入newTable    (选择不同的0作为计数器,序列    来自表) 这将把每个序列号放在表中一次,每个序列的计数器将设置为0。

然后,创建一个带有TWO更新语句和一些额外逻辑的更新过程:

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

然后运行一个proc来为表中的每条记录执行此proc。

现在,您应该为表中的每条记录填充当前使用的计数器的“newTable”。设置插入过程,以便在创建新记录时,如果它是新表中尚未存在的序列,则将其添加为计数1,并在主表中放置计数1。如果序列DOES已经存在,请使用上面的逻辑(增加已使用的计数“newTable”并将该计数值作为计数器值放在newTable和mainTable中。

基本上,此方法决定使用内存代替查询现有表。如果你有一个包含大量重复序列号的大表,那将是最有益的。如果您的序列号只发生两次或三次,您可能希望在更新后再进行查询,然后再插入:

首先,要更新:      - 找出计数器值     声明l_counter int     select l_counter = max(counter)     从表中序列= @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)

同样,我很肯定我在这里混合和匹配我的语法,但概念应该有效。当然,它是一个“一次一个”的方法而不是基于设置,所以它可能有点低效,但它会起作用。