分组记录 - ROW NUMBER和PARTITION BY

时间:2015-08-05 13:40:41

标签: sql sql-server

请参阅下面的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,但到目前为止我还没有成功。

3 个答案:

答案 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