[英]Grouping records and starting Row Number as a odd number when partition changes
[英]Grouping records - ROW NUMBER and PARTITION BY
请参见下面的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,但是到目前为止我一直没有成功。
您可以通过几种方式执行此操作,但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;
请改用DENSE_RANK
。
Select Name, DENSE_RANK() Over (Order By Name)
From #Test
您可以通过以下方式获得所需的输出:
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确保编号是顺序的,最后一个查询将这些准备好的结果与原始#Test表相对应,以每行重复数据。
您可以在此处找到有关排名功能的更多信息: https : //msdn.microsoft.com/zh-cn/library/ms189798.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.