SQL:根据另一列的值生成递增整数

时间:2015-06-06 10:32:02

标签: sql sql-server

在SQL Server上。

我正在导入一个如下所示的表:

ForeignID || Detail 
ID1       || detail1
ID1       || detail2
ID1       || detail3
ID2       || detail1
ID3       || detail1
ID3       || detail2

进入一个看起来像这样的新表:

ForeignID  || ItemNo   || Detail
ID1        || 1        || detail1
ID1        || 2        || detail2
ID1        || 3        || detail3
ID2        || 1        || detail1
ID3        || 1        || detail1
ID3        || 2        || detail2

如何自动生成“ItemNo”列值? 它们应该是一个自动递增的整数,只要ForeignID发生变化就会重置。 ForeignID和ItemNo将充当新表的复合主键。

能够在INSERT INTO - SELECT过程中执行此操作会很棒。否则,单独的查询也会起作用。

2 个答案:

答案 0 :(得分:2)

对于ROW_NUMBER来说,这是一项简单的任务:

insert into target
select
   ForeignID
  ,row_number()
   over (partition by ForeignID order by Detail) 
  ,Detail 
from source

答案 1 :(得分:0)

您可以使用行号进行此操作,如下所示:

insert into ... 
select 
    ForeignID, 
    Detail, 
    row_number() over (partition by ForeignID order by Detail) as RowNum
order by
  ForeignID,
  Detail

每次ForeignID更改时,rownum都会开始编号