2

如何编写一个匹配数据并为其生成和标识的查询。

例如:

记录ID | 姓名
1 | 约翰
2 | 约翰
3 | 史密斯
4 | 史密斯
5 | 史密斯
6 | 卡尔

我想要一个查询,它会在名称完全匹配后分配一个身份。

预期输出:

记录ID | 姓名 | ID
1 | 约翰 | 1X
2 | 约翰 | 1X
3 | 史密斯 | 1年
4 | 史密斯 | 1年
5 | 史密斯 | 1年
6 | 卡尔 | 1Z

注意:每个匹配项的 ID 都应该是唯一的。此外,它可以是数字或 varchar。

有人可以帮我吗?最主要的是分配ID。

谢谢。

4

3 回答 3

2

这个怎么样:

with temp as
(
select 1 as id,'John' as name
union
select 2,'John'
union
select 3,'Smith'
union
select 4,'Smith'
union
select 5,'Smith'
union
select 6,'Carl'
)

SELECT *, DENSE_RANK() OVER
(ORDER BY Name) as NewId
FROM TEMP
Order by id

第一部分仅用于测试目的。

于 2013-03-11T21:26:27.793 回答
1

这种结构似乎有效:

CREATE TABLE #Table 
    (
    Department VARCHAR(100),
    Name     VARCHAR(100)
    );

INSERT INTO #Table VALUES
('Sales','michaeljackson'),
('Sales','michaeljackson'),
('Sales','jim'),
('Sales','jim'),
('Sales','jill'),
('Sales','jill'),
('Sales','jill'),
('Sales','j');


WITH Cte_Rank AS
(
SELECT [Name],
       rw = ROW_NUMBER() OVER (ORDER BY [Name])
FROM   #Table 
GROUP BY [Name]
)
SELECT  a.Department,
        a.Name,
        b.rw
FROM    #Table a
        INNER JOIN Cte_Rank b 
        ON a.Name = b.Name;
于 2013-03-11T21:29:52.273 回答
1

请试试:

SELECT *,
Rank() over (order by Name ASC) 
FROM table
于 2013-03-11T21:09:00.660 回答