根据SQL Server中的现有字段创建唯一键

时间:2015-09-01 00:21:19

标签: sql sql-server tsql

Last Name   First Name         DATE        Total-Chrg
Jaime         KRiSH           5/1/2015    -4150.66
Jaime         KRiSH           5/1/2015     1043.66
Jaime         KRiSH           5/1/2015     1043.66
Jaime         KRiSH           5/1/2015      4150.66
Jaime         KRiSH           5/3/2015      4150.66
Peter         Jason           5/1/2015       321.02
Peter         Jason           5/1/2015       321.02
Peter         Jason           5/23/2015     123.02

我希望结果符合以下方式

Uniq ID    Last Name    First Name        DATE         Total-Chrg
1             Jaime       KRiSH           5/1/2015     -4150.66
2             Jaime       KRiSH           5/1/2015     1043.66
2             Jaime       KRiSH           5/1/2015     1043.66
3             Jaime       KRiSH           5/1/2015      4150.66
4             Jaime       KRiSH           5/3/2015      4150.66
5             Peter        Jason          5/1/2015       321.02
5             Peter        Jason          5/1/2015       321.02
7             Peter        Jason          5/23/2015     123.02

我基本上需要创建一个唯一密钥,因为该表没有任何唯一ID。

2 个答案:

答案 0 :(得分:0)

您可以使用row_number()分配一个:

select t.*, dense_rank() over (order by lastname, firstname, date, totalchrg)
from table t;

您可以添加标识值:

alter table add column uniqueId identity(1, 1);

但是,您无法控制哪些行获取哪些值。

答案 1 :(得分:0)

这是一个有效的例子,

请注意,你的答案中有一个错误,7应该是6 !!!

你基本上必须制作一个不同项目的表格。如果此表具有自动ID,则SQL将为您创建密钥。然后,您可以重新加入数据并使用新密钥。

您可以通过在LastName,FirstName,Date和Total(在临时表上)放置索引来加快速度

DECLARE @Data TABLE(LastName NVARCHAR(32),FirstName NVARCHAR(32),Date DATE,Total DECIMAL(18,4))
INSERT INTO @Data
VALUES
('Jaime','KRiSH','5/1/2015',-4150.66),
('Jaime','KRiSH','5/1/2015', 1043.66),
('Jaime','KRiSH','5/1/2015', 1043.66),
('Jaime','KRiSH','5/1/2015', 4150.66),
('Jaime','KRiSH','5/3/2015', 4150.66),
('Peter','Jason','5/1/2015', 321.02),
('Peter','Jason','5/1/2015', 321.02),
('Peter','Jason','5/23/2015',123.02)

CREATE TABLE #Temp (ID INT IDENTITY(1,1),FirstName NVARCHAR(32),LastName NVARCHAR(32),Date DATE,Total DECIMAL(18,4))
INSERT INTO #Temp (LastName,FirstName,Date,Total)
SELECT  LastName,
        FirstName,
        Date,
        Total

FROM        @Data
GROUP BY    FirstName,LastName,Date,Total

SELECT      T.ID,D.LastName,D.FirstName,D.Date,D.Total
FROM            @Data AS D
INNER JOIN  #Temp AS T ON T.LastName = D.LastName AND T.FirstName = D.FirstName AND T.Date = D.Date AND T.Total = D.Total

DROP TABLE #Temp