SQL Server:列的自动增量,由另一列中的值分区

时间:2015-05-05 15:12:22

标签: sql-server row-number

任何人都有以下解决方案吗? (两种情况下的代码片段应作为完整块运行)

以下代码模拟了日常处理作业的情况。

这是第1天

Declare @poitem_source table (PONum int, txt varchar(50), status varchar(25)) 
Declare @poitem_destination table (PONum int, LineNum int, txt varchar(50)) 

insert @poitem_source 
values (1,'Item1', 'NEW'), (1,'Item2', 'NEW'), 
       (1,'Item3', 'NEW'), (2,'Item1', 'NEW'), 
       (2,'Item2', 'NEW')

update @poitem_source 
set status = 'PROCESSING' 
where status = 'NEW'

insert @poitem_destination 
   SELECT 
      PONum, 
      ROW_NUMBER() OVER (PARTITION BY PONum ORDER BY PONum) AS POLineNumber, 
      txt 
   FROM 
      @poitem_source 
   WHERE 
      status = 'PROCESSING'

update @poitem_source 
set status = 'DONE' 
where status = 'PROCESSING'

select * 
from @poitem_destination 
order by PONum, txt

如果您运行它,您将看到LineNum为目标表中的每个PONum递增1 ... n。

然而,这显然不适用于第2天......这里是代码......

Declare @poitem_source table (PONum int, txt varchar(50), status varchar(25)) 
Declare @poitem_destination table (PONum int, LineNum int, txt varchar(50)) 

insert @poitem_source 
values (1,'Item1', 'NEW'), (1,'Item2', 'NEW'), (1,'Item3', 'NEW'), 
       (2,'Item1', 'NEW'), (2,'Item2', 'NEW')

update @poitem_source 
set status = 'PROCESSING' 
where status = 'NEW'

insert @poitem_destination 
   select
      PONum, 
      ROW_NUMBER() OVER (PARTITION BY PONum ORDER BY PONum) AS POLineNumber, 
      txt 
   from 
      @poitem_source 
   where 
      status = 'PROCESSING'

update @poitem_source 
set status = 'DONE' 
where status = 'PROCESSING'

select * 
from @poitem_destination 
order by PONum, txt

--- 2nd day

insert @poitem_source 
values (1,'Item4', 'NEW'), (2,'Item3', 'NEW')

update @poitem_source 
set status = 'PROCESSING' 
where status = 'NEW'

insert @poitem_destination 
   select
      PONum, 
      ROW_NUMBER() OVER (PARTITION BY PONum ORDER BY PONum) AS POLineNumber, 
      txt 
   from @poitem_source 
   where status = 'PROCESSING'

update @poitem_source 
set status = 'DONE' 
where status = 'PROCESSING'

select * 
from @poitem_destination 
order by PONum, txt

对于第2天,附加项目的行号为1,因为选择查询没有以任何方式链接到目标表格(我不相信它可以)。

任何人都有另一种生成这些行号的解决方案吗?

由于

2 个答案:

答案 0 :(得分:0)

将IDENTITY列添加到您的表中(这将是表的主键的良好候选者)。这将在表格中为其提供唯一的递增行号。然后,您可以维护每日行号。

像这样:

Declare @poitem_source table (ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, PONum int, txt varchar(50), status varchar(25))

或者,您可以将行号列设为IDENTITY(1,1);然而,这将丢失数据,并可能导致你的问题(“我需要从第Y天开始的LineNumber X ......”现在将更难获得)。

答案 1 :(得分:0)

解决方案如下

/foo/

所以现在我们可以使用PONum& LineNum作为主键