![](/img/trans.png)
[英]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.