2009-02-13 44 views
4

我有一种情况,我需要为每组记录添加一个任意的唯一标识。下面可以更容易地看到它。在记录组内分配唯一ID

编辑了11:26 est: 目前lineNum字段有垃圾。这是在sql server 2000上运行的。下面的示例是结果应该是什么样子,但实际值并不重要,只要两个组合字段可用于唯一键,数字就可以是任何值。

OrderID  lineNum 
AAA   1 
AAA   2 
AAA   3 
BBB   1 
CCC   1 
CCC   2 

行号的值不重要,但该字段只有4个字符。这需要通过在sql server存储过程中完成。我在编程方面没有问题。

+0

您发布的表格是您想要的还是您拥有的?请发布两个:你现在拥有什么和你想得到什么。至于现在,它很混乱。 – Quassnoi 2009-02-13 15:52:12

回答

8

假设你使用SQL Server 2005或更好您可以使用ROW_NUMBER()

select orderId, 
     row_number() over(PARTITION BY orderId ORDER BY orderId) as lineNum 
from Order 
0

您可以创建一个游标来读取所有排序的值,然后在每次更改值时重置1,然后每次增加一次。

例如为:

AAA reset 1 
AAA set 1 + 1 = 2 
AAA set 2 + 1 = 3 
BBB reset 1 
CCC reset 1 
CCC set 1 + 1 = 1 
0

Hmmmmm,您可以创建,为了和这组根据您的订单ID返回行号信息的看法?确保行号始终以相同的顺序返回。

无论是或者你可以使用触发器,并在插入计算订单的最大ID?

或者你也许可以在插入中使用从max语句选择?

也许这些都不令人满意?

0

增加了一条记录表中,您可以创建动态的 “LINENUM” 字段:

在Transact-SQL中,这样的事情:

Declare @lineNum AS INT 

-- Get next linenum 
SELECT @lineNum = MAX(COALESCE(linenum, 0)) FROM Orders WHERE OrderID = @OrderID 
SET @lineNum = @lineNum + 1 

INSERT INTO ORDERS (OrderID, linenum, .....) 
VALUES (@OrderID, @lineNum, ....) 
0

如果你不使用SQL 2005这是一个稍微基于集合的方式来做到这一点(我不喜欢临时表很多,但我喜欢的光标升ess):

declare @out table (id tinyint identity(1,1), orderid char(4)) 

insert @out select orderid from THESOURCETABLE 

select 
    o.orderid, o.id - omin.minid + 1 as linenum 
from @out o 
    inner join 
     (select orderid, min(id) minid from @out group by orderid) as omin on 
      o.orderid = omin.orderid