T-SQL:Row_number()group by

时间:2016-07-26 03:55:46

标签: sql sql-server tsql

我使用的是SQL Server 2008 R2,结构如下:

create table #temp( deptid int, regionid int)

insert into #temp
select 15000, 50
union
select 15100, 51
union
select 15200, 50
union
select 15300, 52
union
select 15400, 50
union
select 15500, 51
union
select 15600, 52

select deptid, regionid, RANK() OVER(PARTITION BY regionid ORDER BY deptid)       AS 'RANK',
       ROW_NUMBER() OVER(PARTITION BY regionid ORDER BY deptid) AS 'ROW_NUMBER',
       DENSE_RANK() OVER(PARTITION BY regionid ORDER BY deptid) AS 'DENSE_RANK'
from #temp

drop table #temp

目前输出如下:

deptid  regionid    RANK    ROW_NUMBER  DENSE_RANK
--------------------------------------------------
15000   50          1       1           1
15200   50          2       2           2
15400   50          3       3           3
15100   51          1       1           1
15500   51          2       2           2
15300   52          1       1           1
15600   52          2       2           2

但我的要求是row_number超过regionid列,而是按行分组,而不是逐行。为了更好地解释,下面是我想要的结果集。

deptid  regionid    RN
-----------------------
15000   50          1                   
15200   50          1              
15400   50          1                   
15100   51          2              
15500   51          2                   
15300   52          3                   
15600   52          3

如果我的问题不清楚,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:3)

使用dense_rank() over (order by regionid)获取预期结果。

select deptid, regionid, 
 DENSE_RANK() OVER( ORDER BY regionid) AS 'DENSE_RANK'
from #temp

在rank / row_number窗口函数中进行分区将在分区内分配数字,因此您不需要在regionid上使用分区来自己对regionids进行排序。