请参阅下面的DDL:
create table #Test (ID int identity not null, name varchar(100), primary key (id))
insert into #Test (name) values ('Ian')
insert into #Test (name) values ('Ian')
insert into #Test (name) values ('Ian')
insert into #Test (name) values ('Mark')
insert into #Test (name) values ('James')
insert into #Test (name) values ('James')
insert into #Test (name) values ('Henry')
我正在寻找下面的输出:
Ian 1
Ian 1
Ian 1
Mark 2
James 3
James 3
Henry 4
所有的Ians'有相同的号码。所有的詹姆斯'有相同的号码。我一直在试验ROW NUMBER和PARTITION BY,但到目前为止我还没有成功。
答案 0 :(得分:2)
您可以通过几种方式执行此操作,但row_number()
本身不是其中之一。
这是一种方法:
select t.name, dense_rank() over (order by nameid)
from (select t.*, min(id) over (partition by name) as nameid
from #test t
) t;
这会计算每个名称的最小ID,然后将其用于dense_rank()
。
如果您不关心特定排序,可以在名称上使用dense_rank()
:
select name, dense_rank() over (order by name)
from #test t;
答案 1 :(得分:0)
改为使用DENSE_RANK
。
Select Name, DENSE_RANK() Over (Order By Name)
From #Test
答案 2 :(得分:0)
您可以通过以下方式获得所需的输出:
with prep as
(
select name
, DENSE_RANK() over (order by c) [rank]
from (
select distinct name, min(id) c
from #Test
group by name
) a
)
select T.name
, prep.[rank]
from #Test T
inner join prep on prep.name = T.name
第一个(子)查询选择每个记录的最低可能ID,DENSE_RANK然后确保编号是seqential,最终查询使用那些准备结果对原始#Test表复制每行数据。
您可以在此处找到有关排名功能的更多信息:https://msdn.microsoft.com/en-us/library/ms189798.aspx