SQL Server:将序列号添加到具有相同键字段的行,每个键值

时间:2017-04-25 00:11:02

标签: sql-server

我有一个SQL Server数据库,其表的字段包含多行的相同值。我想为字段中具有相同值的行添加序列号。例如,如果我的数据是;

Field1
A
A
B
B
B

我想要每行的序列号,如;

Field1     SequenceNumber
A              1
A              2
B              1
B              2
B              3

3 个答案:

答案 0 :(得分:0)

您应创建一个新表,否则,如果没有主键或唯一索引,则无法更新表。

create table new_table
(
    id int,
    field1 char(1)
);

with seqnum as
(
    select field1, row_number() over (partition by field1) id
    from your_table
)
insert into new_table (id, field1)
values (seqnum.id, seqnum.field1;

现在您可以在(id,field1)

上创建主键

或删除old_table并使用旧名称重命名new_table。

如果您的实际表具有唯一索引,则可以使用它来更新它。

答案 1 :(得分:0)

无法为每个组提供自动重置序列号,完全由服务器强制执行。它只能在单行或整个表上本机强制执行约束。

您可以使用相当复杂的触发器执行某些步骤,但随后遇到并发问题。我的建议是简单地在每一行上添加一个日期列。在查询或应用程序使用时,您只需按Field进行分组,然后按日期列进行排序。这将实现完全相同的事情(将行放在特定的,可数的,通常可分配的位置)。

答案 2 :(得分:0)

我在另一个话题中找到了这个

select Field1
Row_Number() OVER (PARTITION BY Field1 order by Field1) as SequenceNumber
from mytable
order by Field1, SequenceNumber