将数据划分为子组

divide data into subgroups

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

你可以只使用算术:

select 1 + floor((row_number - 1) / 4) as newColumn
from t;

注意:Teradata 更喜欢整数除法,因此 floor() 不是绝对必要的。

有一个旧函数可以将数据分入百分位数,QUANTILE,但已弃用:

QUANTILE(4, ORDER BY whatever ASC)

如果您已经使用了另一个 OLAP 函数,您最好将其重写为

4 * (RANK() OVER (ORDER BY whatever) - 1) 
/ COUNT(*) OVER()

return 都是介于 0 和 n 之间的值,因此您必须加 1 才能获得预期结果。

顺便说一句,在标准 SQL 中有 NTILE,return 结果略有不同,参见 Missing Functions: CUME_DIST & NTILE