将数据划分为子组

时间:2017-06-29 19:31:00

标签: sql teradata

我有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

2 个答案:

答案 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