我有一张包含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
答案 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;