如何添加每个分组唯一的标识列

时间:2010-08-03 14:54:02

标签: sql-server-2005

说我有2列

Product     Product_Cat
-------     -----------
Cat         0
Dog         0
Potatoes    2
Carrots     2
Laundry     1
Bird        0

我想添加第3个标识列,但我希望每个Product_Cat的编号都是唯一的 所以输出看起来像

Product     Product_Cat     Cat_Ident
-------     -----------     ---------
Cat         0               1
Dog         0               2
Potatoes    2               1
Carrots     2               2
Laundry     1               1
Bird        0               3

你是怎么做到的?


这当然不是我的真实数据,而是我想要做的简化。在我的实时系统中,我有4585个不同的“Product_Cat”值,它们在类别中的范围从1到2408“产品”。

3 个答案:

答案 0 :(得分:3)

您需要使用RANK(),如下所示:

CREATE TABLE #Products
(
    ID int IDENTITY(1,1),
    Product nvarchar(8),
    Product_Cat int
)
GO

INSERT INTO #Products (Product, Product_Cat)
VALUES ('Cat', 0)
,('Dog', 0)
,('Potatoes', 2)
,('Carrots', 2)
,('Laundry', 1)
,('Bird', 0)
GO

ALTER TABLE #Products
    ADD Cat_Ident int
GO

UPDATE #Products
    SET Cat_Ident = rankVal
FROM #Products 
    INNER JOIN (
        SELECT ID, RANK () OVER (PARTITION BY Product_Cat ORDER BY ID ) AS rankVal
        FROM #Products ) rankings ON #Products.ID = rankings.ID

SELECT * FROM #Products

DROP TABLE #Products

结果是:

ID          Product  Product_Cat Cat_Ident
----------- -------- ----------- -----------
1           Cat      0           1
2           Dog      0           2
3           Potatoes 2           1
4           Carrots  2           2
5           Laundry  1           1
6           Bird     0           3

(6 row(s) affected)

答案 1 :(得分:0)

我们需要更多信息,但看起来您需要使用触发器来形成cat_ident的值。

一个简单的SELECT COUNT()+1 GROUP BY ProductCat应该有帮助

答案 2 :(得分:-1)

INSERT INTO Products
           (Product
           ,Product_Cat
           ,Cat_Ident)
     VALUES
           ('Flower'
           ,1
           , (select ISNULL( (SELECT top (1) Cat_Ident +1  as x
               FROM Products
              where Product_Cat =1
                    order by  Cat_Ident desc),'1') ))