繁体   English   中英

分组记录-行数和分区依据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM