我有y = 20行,并希望创建一个新行,将行划分为n个子组。我们说n是4,结果将是:
RowNumber NewColumn
1 1
2 1
3 1
4 1
5 1
6 2
7 2
8 2
9 2
10 2
11 3
12 3
13 3
14 3
15 3
16 4
17 4
18 4
19 4
20 4
我怎样才能在SQL / TeraData中实现这个目标?
PS:
要添加到已接受的答案,我正在使用这些内容:
1 + FLOOR((ROW_NUMBER() OVER (ORDER BY Id DESC ) - 1) / 100) AS SubGroup
答案 0 :(得分:1)
你可以使用算术:
select 1 + floor((row_number - 1) / 4) as newColumn
from t;
注意:Teradata更喜欢整数除法,因此floor()
并非绝对必要。
答案 1 :(得分:1)
有一个旧函数可以将数据存储到百分位数QUANTILE,但它已被弃用:
QUANTILE(4, ORDER BY whatever ASC)
当您已经使用其他OLAP函数时,最好将其重写为
4 * (RANK() OVER (ORDER BY whatever) - 1)
/ COUNT(*) OVER()
两者都返回0到n之间的值,因此您必须添加1才能获得预期结果。
顺便说一句,在标准SQL中,NTILE
会返回略有不同的结果,请参阅Missing Functions: CUME_DIST & NTILE