将数据划分为子组
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
我有 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