簡體   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