如何在sql中对每个行进行排名/分组

时间:2017-03-23 11:44:58

标签: sql sql-server

我有一张包含6条记录的表,需要以下面的格式得到结果,将它们分成3行。

输入表:

id     Value
-------------
1       abcd
2       defgh
3       ijkl
4       mnop
5       qrst
6       uvwx

所需的输出格式:

Rank   id     Value
--------------------
1       1     abcd
1       2     defgh
1       3     ijkl
2       4     mnop
2       5     qrst
2       6     uvwx

3 个答案:

答案 0 :(得分:2)

这是一种方法:

select dense_rank() over (order by (id - 1)/3) as grp, id, value
from t;

与您的示例数据一样,这假设id从1开始并且没有间隙地增加。

如果不是这样,那么另一种选择是:

select dense_rank() over (order by seqnum/3) as grp, id, value
from (select t.*, row_number() over (order by id) - 1 as seqnum
      from t
     );

答案 1 :(得分:1)

你可以在这里使用NTILE()。

SELECT NTILE(2) OVER(ORDER BY id),id FROM TABLE_NAME

将其视为桶,NTILE(2)将生成2个桶,一半行的值为1,另一半值为2

答案 2 :(得分:0)

如果Id没有间隙并以1:

开头
select (id + 2) / 3 as [Rank], Id, Value 
from YourTable;

但如果Id有差距?例如1,2,4,5,...
然后窗口函数row_number()可以修复:

select (row_number() over (order by id) + 2) / 3 as [Rank], Id, Value 
from YourTable;