SQL根据分组列值添加IDENTITY

时间:2017-12-06 01:31:45

标签: sql sql-server select

我有这样的数据:

FirstName     LastName
El            Even
Mike          Wheeler
Mike          Byers
Dustin        Henderson

我想要的输出是将Identity添加到每个唯一的FirstName

ID   FirstName     LastName
1    El            Even
2    Mike          Wheeler
2    Mike          Byers
3    Dustin        Henderson 

我这样做的方式是:

/* part 1 */
SELECT IDENTITY(int, 1,1) AS ID, FirstName 
INTO TabTemp FROM TabName 
GROUP BY FirstName

/* part 2 */
SELECT B.ID, A.FirstName, A.LastName 
INTO TabTempFinal FROM TabName A, TabTemp B
WHERE A.FistName = B.FirstName

我的问题是我可以在不使用第2部分的情况下实现结果吗?

3 个答案:

答案 0 :(得分:2)

您可以使用dense_rank窗口函数:

SELECT DENSE_RANK() OVER (ORDER BY first_name) AS id,
       first_name,
       last_name
FROM   tabname

答案 1 :(得分:1)

不是真的。您无法将identity列添加到身份不应该唯一的表中。这不是identity列的工作方式。

但是,您可以改为使用dense_rank()

SELECT DENSE_RANK() OVER (ORDER BY FirstName) AS ID,
       FirstName, LastName
INTO TabTempFinal
FROM TabName ;

这会为每个FirstName生成唯一指标。唯一的区别是该列不是identity列。

答案 2 :(得分:1)

您可以使用DENSE_RANK

对CTE进行更新
WITH cte AS (
    SELECT FirstName, LastName, DENSE_RANK() OVER (ORDER BY FirstName) dr
    FROM TabName
)

UPDATE cte
SET ID = dr;

这假设您已经有一个名为ID的列。