说我有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“产品”。
答案 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') ))