数据与SQL匹配并分配标识ID';s

数据与SQL匹配并分配标识ID';s,sql,sql-server,identity,matching,Sql,Sql Server,Identity,Matching,如何编写与数据匹配的查询,并为其生成和标识 例如: RecordID | Name 1 | John 2 | John 3 | Smith 4 | Smith 5 | Smith 6 | Carl 记录ID |名称 1 |约翰 2 |约翰 3 |史密斯 4 |史密斯 5 |史密斯 6 |卡尔 我想要一个查询,将分配一个完全匹配后的名称身份 预期产出: RecordID | Name | ID 1

如何编写与数据匹配的查询,并为其生成和标识

例如:

RecordID | Name 1 | John 2 | John 3 | Smith 4 | Smith 5 | Smith 6 | Carl 记录ID |名称 1 |约翰 2 |约翰 3 |史密斯 4 |史密斯 5 |史密斯 6 |卡尔 我想要一个查询,将分配一个完全匹配后的名称身份

预期产出:

RecordID | Name | ID 1 | John | 1X 2 | John | 1X 3 | Smith | 1Y 4 | Smith | 1Y 5 | Smith | 1Y 6 | Carl | 1Z 记录ID |名称| ID 1 |约翰| 1X 2 |约翰| 1X 3 |史密斯| 1Y 4 |史密斯| 1Y 5 |史密斯| 1Y 6 |卡尔| 1Z 注意:每个匹配的ID都应该是唯一的。此外,它可以是数字或varchar

有人能帮我吗?主要的事情是分配ID

谢谢。

请尝试:

SELECT *,
Rank() over (order by Name ASC) 
FROM table
请尝试:

SELECT *,
Rank() over (order by Name ASC) 
FROM table
这个怎么样:

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
第一部分仅用于测试目的。

这一部分如何:

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

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

此结构似乎可以工作:

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;

这种结构似乎有效:

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;


你好欢迎来到SO。我们不希望为您编写代码,而是在您自己尝试之后帮助您进行调试。您可以试一试并向我们展示您的尝试吗?您是如何在ID字段中生成值的?您使用的是什么RDBMS?@Wax。当然让我分享我的想法did@AbeMiessler这些是虚拟值。嗨。欢迎来到SO。我们不希望为您编写代码,而是在您自己尝试之后帮助您进行调试。您可以试一试并向我们展示您的尝试吗?您是如何在ID字段中生成值的?您使用的是什么RDBMS?@Wax。当然让我分享我的想法did@AbeMiessler这些都是伪值。这些值对于每个分区都不是唯一的。我的意思是,对于John,twp值被赋值为1和2,对于Smith,同样是1,2和3。我希望约翰和史密斯分别为1岁和2岁。请立即重试。由于某些原因,Rank()函数不起作用。“密集等级”正在运行。@约翰:我认为这在每台SQL Server中都是可用的。您正在使用哪一台SQL Server?@Wawrzyneic Rank()正在工作,但不符合我们的需要。另外,我使用的是SQL server 2008。每个分区的值不是唯一的。我的意思是,对于John,twp值被赋值为1和2,对于Smith,同样是1,2和3。我希望约翰和史密斯分别为1岁和2岁。请立即重试。由于某些原因,Rank()函数不起作用。“密集等级”正在运行。@约翰:我认为这在每台SQL Server中都是可用的。您正在使用哪一台SQL Server?@Wawrzyneic Rank()正在工作,但不符合我们的需要。另外,我正在使用SQL server 2008.Perfect。它工作得很好。非常感谢你。嘿你能给我推荐一些书来学习这种类型的查询吗?我不太会读书。我的建议是,坚持下去,遇到困难时过来。太好了。它工作得很好。非常感谢你。嘿你能给我推荐一些书来学习这种类型的查询吗?我不太会读书。我的建议是,坚持下去,遇到困难时过来。